分类: Java
2008-04-25 15:38:43
9.2.2 一个applet与servlet通过HTTP对象串行化方式通信:
在servlet和applet 之间传递一个对象,这个对象可以带有多个属性,对象被传输后,其属性的值也就被传递了。为了便于与HTTP方式的普通的参数传递比较,我把这两种方式放在一起,进行比较。
首先servlet能对对象的请求进行响应,并将对象返回,原来的DaytimeServlet更改如下:
//DaytimeServlet.java
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DaytimeServlet extends HttpServlet{
public Date getDate(){
return new Date();
}
public void doGet (HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException
{
if ("object".equals(req.getParameter("format"))){
ObjectOutputStream out =
new ObjectOutputStream(res.getOutputStream());
out.writeObject(getDate());
}
else{
PrintWriter out = res.getWriter();
out.println(getDate().toString());
}
}
public void doPost (HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException
{
doGet(req , res);
}
}
可以看出发送一个串行化的java对象非常简单。通过对象串行化技术可以发送任何实现了串行化接口的原始类型和任何的java对象,只要接收端和发送端采用相同的对对象顺序和方式,一个servlet可以把多个对象放在同一个ObjectOutputStream中。
在对象串行化的响应中,没有指明响应的MIME类型,主要原因是没有MIME类型代表JAVA OBJECT。不过只要applet知道servelt的响应的对象的类型,就能做相应的处理,因此,这并不是个大问题,而且java对象串行化的优势在这里也得到体现。
注:MIME的类型参见附录。
相应的applet也更改如下:
//DaytimeServlet.java
import java.applet.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import java.net.URL;
import cuug.HttpMessage;
public class DaytimeApplet extends Applet{
TextField HttpText,httpObject;
Button refresh;
public void init(){
setLayout(new BorderLayout());
Panel west = new Panel();
west.setLayout(new GridLayout(2,1));
west.add(new Label("HTTP text:",Label.RIGHT));
west.add(new Label("HTTP Object:",Label.RIGHT));
add("West",west);
Panel center = new Panel();
center.setLayout(new GridLayout(2,1));
httpText = new TextField();
httpText.setEditable(false);
center.add(httpText);
httpObject = new TextField();
httpObject.setEditable(false);
center.add(httpObject);
add("Center",center);
Panel south = new Panel();
refresh = new Button("Refresh");
south.add(refresh);
add("South",south);
}
public void start(){
refresh();
}
private void refresh(){
httpText.setText(getDateUsingHttpText());
httpObject.setText(getDateUsingHttpObject());
}
private String getDateUsingHttpText(){
try{
URL url = new URL(getCodeBase(),"/servlet/DaytimeServlet");
HttpMessage msg = new HttpMessage(url);
InputStream in = msg.sendGetMessage();
DataInputStream result =
new DataInputStream(new BufferedInputStream(in));
String date = result.readLine();
in.close();
return date;
}
catch (Exception e){
e.printStackTrace();
return null;
}
}
private String getDateUsingHttpObject(){
try{
URL url = new URL(getCodeBase(),"/servlet/DaytimeServlet");
HttpMessage msg = new HttpMessage(url);
Properties props = new Properties();
props.put("format","object");
InputStream in = msg.sendGetMessage(props);
ObjectInputStream result = new ObjectInputStream(in);
Object obj = result.readObject();
Date date = (Date)obj;
return date.toString();
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
public boolean handleEvent (Event event) {
switch (event.id){
case Event.ACTION_EVENT:
if (event.target == refresh ){
refresh();
return true;
}
}
return false;
}
}
在getDateUsingHttpObject()中实现了向servlet发送请求,并取回响应的过程。与普通HTTP文本方式相比主要有两点不同:一、创建了参数“format”并把其值设为“object”来向DaytimeServlet表明需要servlet来返回一个串行的对象;二、将返回的内容作为一个对象来读取,用ObjectInputStream和readObject()方法。