HTTP对象流
你也许还没有意识到HTTP连接也可以用来传输二进制的数据,就象传输文本数据一样,但是事实上每次你从一个web看到图象时或者是下载.zip文件时都在使用这个功能。
我们可以利用这个功能并结合被称之为“对象序列”的技术从Servlet向Applet传输完整的Java对象。复杂的数据可以很容易地被传输,你不需要做任何解析和解释。
对象序列允许我们将对象封装到二进制数据流,它可以到达一个OutputStream可以到达的任何地方:磁盘、屏幕或者是在我们的例子中,通过一个HTTP连接到达一个Applet。
对象序列是JVM1.1和更高的版本才支持的功能,所以有一些老版本的浏览器不支持这一功能。但是Sun公司的Java插件几乎可以对所有的浏览器进行升级以支持最终版本的Java,这样它就可以支持对象序列。
使用HTTP对象流和使用HTTP文字流的方法几乎一样。我们建立一个到我们的web主机上的Servlet的URL连接并读取其返回的数据。只不过我们不再是将InputStream封装到DataInputStream中,而是将其封装到ObjectInputStream中。我们可以按照适当的类型读取其中的对象。
清单3显示了我们用来交换一个对象的一段代码,这个对象用来从Servlet获得有关书目的信息(包括作者、题目、价格和其它信息)。你会注意到在这里我们用ObjectOutputStream取代了清单1中的PrintWriter,其基本概念是相同的。
清单3
public void doGet(HttpservletRequest req,
HttpservletResponse res)
throws servletException, IOException
{
OutputStream out;
ObjectOutputStream objStream;
out = res.getOutputStream();
objStream = new ObjectOutputStream(out);
Album album = fetchNextAlbum();
out.writeObject(album);
}
这个Servlet会生成书目对象的序列化版本,它可从它的fetchNextAlbum()方法作为一个数据流被接收。如果你通过一个web浏览器来访问这个Servlet,你会看到一堆垃圾,这是因为目前你只能处理文本而不能处理二进制数据的对象序列。
请注意这个对象必须执行Serializable接口以使其序列化。此外,任何引用这个对象的其他对象也必须执行Serializable接口。
在Applet端,每当用户单击Applet的Next按钮时,我们可以使用方法getNextAlbum()(程序如清单4所示)来从服务器获得书目对象。Applet将查询这个对象并显示其中的数据。
清单4
private Album getNextAlbum()
throws MalformedURLException,
IOException
{
URL url = new URL(getCodeBase(),
"/servlet/Albumservlet");
URLConnection con = url.openConnection();
con.setUseCaches(false);
InputStream in = con.getInputStream();
ObjectInputStream objStream;
objStream = new ObjectInputStream(in);
album = (Album)objStream.readObject();
return album;
}
正如你看到的,对象流给我们提供了一个非常简便的方法在Applet和Servlet之前交换一组复杂的信息。请注意我们所处理的不是单纯的数据而是对象,所以你可以在客户端和服务器之间重用这个对象。这使得我们的程序更为智能化并且可以防止重复的逻辑处理。
Socket连接
另外,一种不太常用的Applet和Servlet的通信策略是在两者之间建立Socket连接。这意味着开发者利用Socket连接设计并执行适当的协议来处理两者之间的通信。
使用Socket的一个大的好处是这个连接是持续的而且是双向的。
一个基于HTTP的连接只能短暂地交换信息。如果你想要不断地用新的信息更新Applet,你必须不断地建立新的HTTP连接。而对于一个Socket连接来说,你可以只建立一个与服务器的连接,就能实现不断地更新。
当然,你可能想要建立一个多线程的系统,这样可以有几个Applet同时与服务器联系。请注意使用Socket有的时候并不是一个适当的方法,绝大多数的防火墙不允许通过罕见的端口号进行通信。然而,在一个内部的Intranet上,这还是一项很有用的技术。
APPLET和SERVLET的协同工作
在这篇文章中,我们讨论了有关建立一个前端使用Applet、后端使用Servlet的应用程序的一些有用的策略。Applet只有一个唯一的通信路径,但是我们可以有几种在Applet和Servlet之间交换信息的方式。
Sun公司的应用程序模型所推荐的策略和我们在这里讨论的一样。将事务逻辑从界面中分离可以使得应用程序更加灵活,易于升级,这样的应用程序也更易于设计和维护。
但是这个模型不允许你的Applet直接访问你的企业数据,这会大大减少你的系统的复杂性并大大提高你的系统的安全性。Applet和Servlet的协同工作将有助于建立一个较好的应用。
企业级应用中的Applet和Servlet的通信(三)
来源:JR
作者:未知
时间:2006-07-24
点击:
0
最新评论共有 0 位网友发表了评论
查看所有评论
发表评论
- 栏目列表
-
热点关注
- Java手机程序设计入门电子
- Java学生成绩管理系统源代
- java.util.Calendar的用法
- 使用response.sendRedirec
- 如何把java程序编译成.exe
- 结合JAVASCRIPT将HTML导入
- JAVA-IO包的学习引导文章
- 我的Mysql5.0中文乱码解决
- JAVA EXCEL API
- JSP与ASP.NET简单之比较!
- jsp与javascript的结合在
- 利用javabean轻松实现对数
- WebLogic的安装和配置
- 关于java的Classpath全解&
- tomcat配置手册(server.x
- JAVA面试题集
- MySQL5.0中文问题及JDBC数
- java的md5加密类
- W3 Jmail 简要介绍
- java读文件

