当前位置: 首页 > 图文教程 > 网络编程 > JSP > 企业级应用中的Applet和Servlet的通信(三)

JSP
Servlet及JSP中的多线程同步问题
使用Ant和Tomcat创建Web应用
如何直接在浏览器内运行SQL命令
Servlet、Jsp中的多国语言显示
html与jsp开发分离技术
通过Jsp发送动态图像
Servlets和JSP Pages最佳实践
学习在JSP中使用JavaBeans
JSP显示内容缓存技巧
应用JDOM处理数据库到XML转换的JSP实现
JSP中tomcat的SQL Server2000数据库连接池的配置
用JSTL实现JSP应用程序快速开发
浅谈4种类型的JDBC驱动程序
怎样设置 JSP 的虚拟目录
Java 中对文件的读写操作之比较
javamail在jsp中调用
jsp中任意文字转Unicode的通用模块
JSP与SQL SERVER的留言本
jspSmartUpload上传下载全攻略
Tomcat5.x中的虚拟主机配置方法

JSP 中的 企业级应用中的Applet和Servlet的通信(三)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-03   浏览: 231 ::
收藏到网摘: n/a

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的协同工作将有助于建立一个较好的应用。