前段时间给公司做LMS系统,需要在 Applet与Servlet间进行数据通信,查了很多的资料,看了很多高人写的,竟不得要领,许是高人都太高了,以高人之心度了菜鸟之腹,后来自己结合高人的指点,多方摸索,终于算是整成功了,通己痛,以及人之痛,决定以菜鸟的角度写出来跟大家交流交流,希望大家多多给出宝贵的意见:
1、用输入输出流传递对象:
Applet:
import java.net.*;
import java.util.*;
URL url=new URL(getCodeBase(), ServletURL);
/**
*这里,getCodeBase()将返回applet所在的绝对路径,ServletURL是你的servlet与applet的相对路径
*/
URLConnection con = url.openConnection();
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestProperty("Content-Type", "application/octet-stream");
ObjectOutputStream outStream = new ObjectOutputStream ( con.getOutputStream() );
/**
* 这里,con.getOutputStream() ,从URLConnection连接获得输出流,这个输出流被连接到公共网关程
*序的(服务器端)的标准输入流上
*/
Hashtable setMsg = new Hashtable();
setMsg.put("action","getparam");
outStream.writeObject(setMsg);
outStream.flush();
outStream.close();
/**
*把要传送的有关数据对象(可以是任何一种对象,包括你自己定义的类。这里以Hashtable为例)写入输出流
*发送完毕关闭输出流。
*/
ObjectInputStream inStream = new ObjectInputStream ( con.getInputStream() );
/**
* 这里,con.getInputStream() ,从URLConnection连接获得输入流
*值得提醒的是在执行这一语句前servlet将不会做任何GET/POST操作
*本人当初就亏在这里急着测试OutputStream的效果,却不起任何作用。
*/
Hashtable getMsg=(Hashtable)inStream.readObject();
/**
*通过输入流获取从servlet传回的对象。
*/
Servlet:
public void doGet( final HttpServletRequest req ,final HttpServletResponse res ) throws IOException {
ObjectInputStream in = new ObjectInputStream ( req.getInputStream() );
/**
*通过Servlet对象的req参数的getInputStream()得到输入流
*然后通过该对象的readObject()方法得到JAVA对象
*(这个对象即我们在applet中用con.getOutputStream() 所写入的对象)。
*/
Hashtable getMsg=new Hashtable();
try{
getMsg=(Hashtable)in.readObject();
/**
*注意这里的对象类型必须和applet中的一致。
*/
}
catch(Exception e){}
action=(String)getMsg.get("action");
Hashtable msgs=new Hashtable();
msgs.put("uname","test");
ObjectOutputStream out = new ObjectOutputStream( res.getOutputStream() );
out.writeObject(msgs);
out.close();
/**
*通过Servlet对象的req参数的getOutputStream()所得到的输出流新生成一个对象输出流ObjectOutputStream
*类型的对象,然后通过该对象的writeObject()方法输出JAVA对象
*(这个对象即我们在applet中用con.getInputStream() 所得到的对象)。
*/
}
2、在URL地址后附加参数以GET的方式实现参数的传递:
这种方法比较简单,就是在url后面加"?p1=1&p2=2",然后在servlet中,用request.getParameter("p1")获取参数。不过从servlet中穿数据回applet,却仍只能是用对象模式,具体如上面说的一样,这里就不多说了