使用XML配置applet来增强你的web界面
对一般的基于J2EE的系统,用户界面(UI)总不是很健壮,这里我们提供了一个使用Java Plug-in的解决方案:使用applets来解读XML文档中的数据,并按要求显示出它们,XML文档由servlet产生
在标准的J2EE展现层设计中,我们会使用Html来包装servlet和jsp产生的数据,HTML的优势在于,它易于编写、美观
但是当你需要更复杂的GUI时,html就不能满足要求了,比如使用<table>标签,你不能在表格中做到滚动、选择某一行、编辑等操作。你不可能做到让他看起来就象一个电子表格,用户可以执行各种复杂的表格操作.还有当你需要一个层次化的树型列表,可以进行折叠、扩展、拖进、拖出、对节点改名或删除等操作,这些HTML都做不到
当然你可以使用HTML 或DHTML来实现实现一些简单表单和树行为操作,比如使用checkbox来实现行选择.而DHTML呢,难于编写和维护,在发布时也会因浏览器的不同而产生错误.很明显Java applet应该是最好的选择,但如何使用它,怎样把它良好的整合到J2EE的结构中呢?
在J2EE的教程中,SUN公司简单的提到在web客户中使用applet,但更多讲述的是servlet和JSP,因为它们不需要任何插件,SUN特别指出了使用JSP来产生XML文档,XML数据是应用于Web serviced的标准的机读数据,这点很重要.
但是在这篇文章中,我们要介绍的是使用applets来嵌入展现层,它需要使用一个由web 组件(JSP或SERVLET)产生的XML文档作为资源文件,这样就不需要你的applet通过RMI/IIOP来访问远程的EJB,而是直接访问本地的XML文档.
展现层数据:
接下来怎么做呢?,首先让我来回想什么是展现层数据(presentation data),presentation data是从你的商业层(或数据层)获取的、需要被处理显示的数据,presentation data包含2个部分,一个是要显示的数据,一个是用于描述GUI组件的结构和状态的数据,例如,我们考虑一下一个层次化的树型列表;这里是它需要用到的一些数据
各节点的名称、节点是否是文件夹、个节点的内容,这些数据多少很象JTree在它的TreeModel所需的数据,你可以把这些数据用XML来表示,如下:
<?xml version="1.0" encoding="UTF-8"?>
<tree title="My Tree Root">
<folder title="My Folder One">
<leaf title="My Leaf One"/>
</folder>
<leaf title="My Leaf Two"/>
</tree>
你可以继续为各节点添加内容,比如加上节点的图标、它所代表对象的hyperlink以及它代表的对象类(比如现金或日期)
使用applet
当然光有XML文档没甚么用,它主要是服务于applet的.你可以编写applet来解读XML中的数据,把它们应用到图形界面中,例如刚才的用于表述树型数据的XML文档解析到DefaultMutableTreeNode对象中,来使JTree显示数据,图1 显示了整个过程的sequence视图
Figure 1.
在JSP中可以使用标准的HTML标签<applet>或者JSP中的<jsp:plugin>,后者是使用Plug-in模式运行你的applet,它可以让你指定特定的JVM,而不是默认的浏览器使用的JVM,这样可以让浏览器应用最新的Java API。(是使用Java Plug-in有一些缺点:用户不得不下载超过9 MB的插件)
状态改变:
使用Applet的强大之处在于它可以随时对状态改变作出响应,例如,当你对JTree进行增减操作时,要去除了一个文件夹节点(你需要给它分配一个唯一性的ID)
<folder title="My Nice Folder " id="5">
和一个子节点
<leaf title="My Nice Leaf" id="7">
对这种改变,使用如下的一个URL调用来通知系统
http://localhost:8080/tree/node-moved?node-id=7&destination-folder-id=5
使用java.net.URL的openStream()方法来请求该URL,该URL然后把请求由servlet转为session bean的方法调用,进行该删除操作,如果调用成功后,session bean返回如下的一个文档:
<?xml version="1.0" encoding="UTF-8"?>
<tree-move>
<sUCcess/>
</tree-move>
在接到该文档后,客户端执行操作,把这些节点从TreeModel中删除,如果服务端调用失败,则返回下列一个文档
<?xml version="1.0" encoding="UTF-8"?>
<tree-move>
<failure/>
</tree-move>
客户端接收次消息后使用状态消息或对话框报出错误,图2 显示整个过程
Figure 2. Process of an applet firing state changes
最佳实现
以下介绍一些这种模式的技巧
产生尽可能简单的XML的格式
XML对传输和解析的耗用很大,因此应可能保持最简单的结构:只加入必须的数据、使用最简化标签,对"<", ">", 和 "&" 使用类似 xx 的形式转换,否则你可得到解析错误
使用轻量级的SAX解析器
要加快程序的启动时间,要使用轻量级的解析器。我知道的最轻量级的解析器是Aelfred(OpenText的 Aelfred 是一种免费的、专门用于applet的轻量级XML解析器),当然你也可以自己构建自己的解析器,但需要注意使用SAX API对节省内存比DOM更佳,因为它是事件驱动的
别去校验XML
尽量不要直接校验XML,而是对用于产生XML的数据进行预处理,使用GUI中的回馈元素返回错误
只返回你需要的数据 要节省下载时间,你应该只返回一些你需要的数据,比如在返回JTree的数据库时,不一定要把所有的数据库都同时下载,对一些较大的描述你可以在展开某个节点时再下载,加上如下的一个data-link:(这样可以减少加载applet的时间)
<dynamic-folder title="My Dynamic Folder" data-link="http://localhost:8080/tree/url-to-get-more-data?node-id=123"/>
又比如对JTable,你只需要加载现在说需要的数据,比如前50行,如果用户要求,再加载后50行
只为那些必须使用applet的地方使用它们
applet的加载还是较慢,所以只有在对复杂操作的GUI中我们才采用applet,如果可以使用HTML和javascript解决,还是尽量使用更为轻量级的html编码
小结:
使用applet作为展现层,有如下的一些优点:对传统的HTML的一种增强补充,降低了展现层和业务层的过多交互,没有直接使用applets和EJB直接通讯
请查看本文的范例来增强理解:http://www.javaworld.com/javaworld/jw-05-2002/j2ee/jw-0524-j2ee.zip
About the author
Jeremy Dickson has been writing Java code for the past five years in the domain of bioinformatics and life science. He is currently a senior developer at the life science-solutions provider Viaken Systems, working on enterprise Java solutions to data integration problems. Formerly, he has worked on everything from JavaBean components for displaying genetic maps to EJB-based server-side platforms for project management.
阅读英文原文 A J2EE presentation pattern: Applets with servlets and XML
转载自 http://mag.javadigest.net
(出处:http://www.knowsky.com)