Swing存在的问题在于布署时的速度和兼容性问题。现在,它的一个重大改进解决了这些问题并使Java客户端应用程序重新成为一个可行的选择,CPU的速度在过去2年中翻了一番。在JDK 1.3中,基于Swing的应用程序的运行速度已经非常快了,所需要的内存也相当少。这就使我们在布署Swing方面还存在着最后一个问题,那就是如何进行布署,在这里,我们有三种解决方案可供选择。
方案一:Java插件
基于浏览器的Java中最精彩的特性之一是Java插件。对HTML网页作简单的修改就能够消除对浏览器JVM的依赖,并使我们可以在Sun的标准JVM中运行Applet。一旦安装了JRE,Applet就被下载到本地磁盘上,并被放置在高速缓冲区中,再打开带Applet的HTML网页的速度就会快许多,原因是所有的东西都是在本地磁盘上的。为说明其工作原理,我们首先来看看原来的Applet布署方式,HTML网页是如何使用插件的,我们假设你已经掌握了HTML和Java Applet的有关知识,并创建了如下的网页:
<HTML>
<HEAD>
<TITLE>My traditional applet page</TITLE>
</HEAD>
<BODY>
<APPLET CODE=HelloWorld.class ARCHIVE=HelloWorld.jar>
Sorry, looks like I bumped into another browser that doesn't support Java applets
</APPLET>
</BODY>
这种方式的缺点是它依赖浏览器JVM来加载和执行HelloWorld类。考虑到市场上存在有多种浏览器,它们执行Java的方式各不相同,使得Applet的布署成为一件令人恐惧的事。你必须保证在经过测试的JVM中运行Applet。我们不要求浏览器运行Java,而要求浏览器安装和运行我们将要在其中运行Applet的JVM。在IE中,我们可以通过使用<OBJECT>标志来完成这一任务,在其他的浏览器中,这一标志可能会有所不同,例如在Netscape Navigator中是<EMBED>。修改后的网页如下所示:
<HTML>
<HEAD>
<TITLE>My new applet page</TITLE>
</HEAD>
<BODY>
<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
width=100% height=100
codebase="./j2re-1_3_0_02-win.exe#Version=1,3,0,2">
<param name="code" value="HelloWorld.class">
<param name="archive" value="HelloWorld.jar">
<param name="cache_archive" value="HelloWorld.jar">
<param name="cache_option" value="Plugin">
</OBJECT>
</BODY>
上面的网页将使浏览器检查指定ClassID的对象是否已经安装,如果没有安装,则从指定的URL下载JVM,并进行安装。然后浏览器执行插件,并下载和显示Applet。我们可以通过http://192.9.48.9/products/plugin/1.3/demos/applets/GraphLayout/example1.html中的例子来学习其工作原理。关于Java插件更详细的资料请参阅Sun公司的网站。
插件带来的好处是它可以支持各种操作平台上的所有浏览器,此外,它还提供了一个有保障的执行环境,插件只需要安装一次,就可以对所有Applet进行缓冲,使再次访问网站时非常容易。这一方法的一个最大不足之处是,在运行Applet之前,必须下载一个大小为5MB的插件,这在低速的互联网连接上尤其令人不能容忍。事实上,如果你的Applet只是一个大小为5KB的网页顶端的一个钟表,为此而下载一个5MB的插件是得不偿失的。
方案二:使用Java Web Start
布署Java应用软件的另一种方式是Sun公司的Java Web Start,它在本质上与Java插件相似,只是在第一个步骤上有明显的不同。Java Web Start要求在每台台式机上进行人工安装,这一点远不如插件的自动安装。Java Web Start的安装相当简单,一旦安装完毕,依赖Java Web Start的应用程序就可以被下载和安装。就象插件一样,应用程序也是通过互联网发行的。
根据我的经验,Java插件在安装上与Java Web Start相似,但比Java Web Start的用户亲和性更好,原因是它要求的管理员或用户干预更少。也有一些公司创建了自己的功能类似的布署工具,这些工具有时候比Java Web Start还好用。例如,Sitraka公司的DeployDirector在性能上优于Java Web Start,并且安装也更简单。
总而言之,通过使用Java插件和Java Web Start,基于Swing的应用程序的布署比原来要简单和安全许多,但仍然比点击一个只有JavaScript的HTML网页要复杂得多。而且有些用户可能对在本地机器上安装JVM所需要完成的步骤有被胁迫的感觉,或者没有发现Swing所带来的好处,但如果需要一个动态GUI用户界面,使用户享有更多地灵活性,没有一种方法比采用Swing Applet更好了。
此外,如果整个开发都是基于Java的,在HTML请求数据和应用程序内部结构之间就无需进行映射。RMI可以提供快速的双向网络调用,它可以回叫客户端应用程序,提醒用户根据服务器的要求更新显示内容。
方案三、以纯HTML方式布署Java Swing
尽管HTML和Swing在开发客户端应用软件方面各有利弊,但很明显的是,理想的解决方案应该是二者都支持。然而,由于这二种技术在本质上具有较大的区别,在一个应用程序中只能采用二者之一。尽管大多数用户都会喜欢基于Swing的快速交互客户端应用程序,但下载并在客户端系统上安装JRE并非总是一个很好的选择。有时候,安全和防火墙方面的限制使得RMI很难在网络上运行。在这种情况下,我们需要的是一种可以在所有系统上运行的交互式客户端应用程序,即使我们能够使用的客户端应用程序只有浏览器。CreamTec公司的WebCream可以充当Swing-HTML之间的桥梁。
WebCream是一种Java工具,它可以为基于GUI的Java应用程序和Applet提供自动的互联网访问,可以使我们利用AWT和Swing实现GUI前端应用程序,同时,可以自动地使HTML访问该应用程序。在一定程度上,可以把WebCream看作是动态的Java-to-HTML转换工具,它可以即时地把Java中的框架和对话转换为HTML。然后,将Webpage行为模仿为GUI事件,以保持应用程序原有的逻辑。WebCream不要求对现有的表格和业务逻辑进行修改,也无需学习任何新的API,它旨在发行现有的应用程序和applets。WebCream只是设置互联网服务器和描述应用程序属性文件的工具,它的标准版具有全部的功能,而且是免费的。WebCream还无需在客户端的机器上进行安装,甚至无需浏览器支持Java,因为浏览器接收到的全部都是HTML代码。
据所我知,只有WebCream才具有这样的功能,没有其他的工具可以提供相似的解决方案。但也有一些产品采用不同的方法使原本不是为互联网设计的应用程序具有互联网访问功能。Windows 2000中有一种内置的终端服务器(Terminal Server)服务,可以使用户只要在本地系统登录就可以通过远程方式访问服务器。象Citrix系统公司的MetaFrame那样,终端服务器向远程终端发送一个视频流,并为在服务器上运行的应用程序模仿用户的行为。它在高速网络上可以很好地运行,在低速网络上的表现则不尽人意。它在Java应用程序方面还有问题,因为它们不使用本机的绘制和滚动例程。终端服务器的可伸缩性还不太强,原因是每个用户都在运行它的一个拷贝。由WebCream转换过的应用程序在形式上与在本地系统上运行的应用程序有所不同,但它的性能更好,因为只有用户在提交一个页面时,才会与服务器进行连接。所有由具有WebCream功能的应用程序服务的用户可以共享一个JVM,因此也可以大大降低资源的消耗。
为了演示WebCream的工作原理,下面的2个图显示了使用WebCream时,一个样例GUI应用程序在HTML前端应用程序中是如何运行的。图1是一个正在运行的GUI应用程序(源代码),图2是WebCream管理着同一个应用程序,窗口表示浏览器中的网页。
(图1:例子中的GUI程序)
(图2:使用了WebCream后的GUI)
Swing-HTML转换方式并不适合所有的用户,WebCream在一定程度上允许通过HTML访问前端应用而提高基于Swing的前端应用程序的价值。有95%的应用程序可以无缝地转换成HTML,另有5%的程序则需要改变数据的表达和处理方式。