J2EE的另一张面孔:
基于SWT和Java Web Start的应用程序解决方案
第1部分
李凤桐
(河北财华信息技术有限公司,河北石家庄 050000)
摘要:作为一种优秀的程序设计语言,Java在许多方面具有突出的优越性。特别是在企业级应用领域,J2EE的地位至今尚无人能够替代。在实际开发过程中,构建于J2EE体系之上的应用系统常常采用基于浏览器的B/S结构来实现前台表现。这种结构不但免去了繁琐的程序分发工作,而且使得应用系统易于维护和升级。但是,在获得上述优点的同时,它也带来了诸如界面控制过于复杂、人机交互方式不够友好等缺点。本文从解决现有J2EE开发模式缺点的角度入手,探讨了如何利用Eclipse项目的SWT类库和Sun公司的Java Web Start技术来实现集C/S与B/S两种结构的优点于一身的应用程序解决方案。
关键词:J2EE、SWT、Java Web Start、C/S、B/S
从诞生至今短短几年时间,Java凭借其特有的魅力,受到了越来越多的青睐。无论是大型企业应用系统,还是移动信息设备开发,到处都可以见到Java的身影。在企业应用领域中,J2EE作为一种成熟的系统架构,已经成为众多大企业进行应用开发的首选。
选择J2EE进行实际开发时,通常采用的是三层或多层架构,后端由EJB负责同数据库交互,而前端面向终端用户的表现则由Java应用程序或基于浏览器的Web页面来实现。但是经过实践检验,发现这两种表现方式都不是令人十分满意。首先,使用J2SE中标准的GUI(图形用户界面)开发包AWT和SWING编写出的Java应用程序,无论外观还是速度,都难以让人接受。它们的外观总是和同一操作系统平台下的其它软件显得格格不入,对机器配置的需求也似乎永无止境。其次,基于浏览器的Web方式虽然免去了繁琐的程序分发工作并且使得应用系统易于维护和升级,但是html页面对复杂应用逻辑的薄弱的表现方式,又使得编写操作性良好的界面成为一项极为繁重的工作。为此,我们需要另外寻找一种更好的解决方案。
图1:J2EE中的容器、组件与服务
鱼,我所欲也
2001年11月,IBM宣布将价值4千万美元的软件捐给开放源码的Eclipse项目。Eclipse是替代IBM的Visual Age for Java的下一代IDE(集成开发环境),但它的目标似乎不仅仅是成为专门开发Java应用的IDE环境。根据Eclipse的体系结构,通过扩展插件,它将能够应用到任何语言的开发。要想更多地了解Eclipse,可以访问Eclipse的官方网站http://www.eclipse.org/。
使用过Eclipse的程序员多数都会惊叹于它的界面表现。的确,无论是外观风格还是运行速度,几乎没有人会认为这是用Java写出来的:一样熟悉的菜单,一样熟悉的工具条,一样熟悉的按钮和对话框……而这都要归功于SWT!
图2:Eclipse集成开发环境
SWT(Standard Widget Toolkit,标准窗口小部件工具箱)本身仅仅是Eclipse组织为了开发Eclipse的IDE环境所编写的一组底层图形界面API,原本并不提供单独的SWT包下载。但是随着时间的推移,越来越多的开发人员发现SWT无论是在外观上还是在性能上,都已经超越了Sun公司提供的AWT和SWING。根据Eclipse官方描述,SWT组件的设计初衷是为开发人员提供一种高效的、可移植的、并且能够利用操作系统UI特性的实现方式。通过JNI(Java Native Interface,Java本地化接口)技术,SWT将操作系统所提供的各种GUI组件取来“为我所用”。只有那些操作系统中不提供的组件,SWT才自己去做一个模拟的实现。这种设计理念不但使应用程序在外观上能够同本地操作系统融为一体,同时也极大地提高了图形化程序的运行速度,从而很好地克服了AWT和SWING的先天缺陷,受到了广大Java程序员的青睐。
在使用上,SWT同其他第三方类库没有什么区别。从http://download.eclipse.org/downloads/index.php我们可以下载到最新的SWT包,解压缩后就能够得到swt.jar,至于具体的环境配置及类导入这里就不赘述了。唯一需要注意的一点就是JNI本地化库文件。因为SWT使用了JNI技术,所以同时也要找到相对应的JNI本地化库文件。由于版本和操作系统的不同,本地化库文件的名称会略有差异。以Windows平台为例,最新的SWT包所对应的动态链接库为swt-win32-3034.dll。
熊掌,亦我所欲也
无论采用何种语言,基于C/S(客户机/服务器)模式开发的应用程序总是会有一些令人很不愉快的特性。与B/S(浏览器/服务器)模式相比,C/S模式虽然具有人机界面友好、交互能力强等优点,但是其繁琐的发布方式却使得程序的部署、维护与升级成为一项让人头疼的工作。当用户数量超过两位数时,那简直就是一场噩梦。Java Web Start或许就是这一噩梦的终结者。
图3:Java Web Start应用程序管理器
Java Web Start是Sun公司推出的应用部署技术,它能够使用户不必经过复杂的安装过程就可以下载并运行所需的应用程序。通过Java Web Start,应用程序的安装运行被简化成了在Web页面上对一个超级链接的点击。Java Web Start将程序运行所需的所有文件下载到本地计算机并缓存,这样就可以在任何时候通过桌面上的快捷方式或浏览器中的超级链接再次启动应用程序。同时,它还负责程序版本的自动检测。无论使用哪种方式启动应用程序,Java Web Start都能确保将最新版本呈现给用户,而整个过程不需要与用户进行任何交互。要想更多地了解Java Web Start,可以访问http://java.sun.com/products/javawebstart/。
最新的Java Web Start的版本号为1.4.2。它是同Java 2 SDK和JRE(Java Runtime Environment,Java运行时环境)捆绑发布的。从http://java.sun.com/j2se/1.4.2/download.html我们可以下载到Java 2 SDK和JRE的安装包。关于Java Web Start技术的具体应用,我们将在后面结合演示工程进行详细介绍。
鱼与熊掌不可得兼?
到现在为止,我们已经介绍了用于解决现有J2EE开发模式缺点的两项关键性技术:一是SWT,主要用作客户端程序的界面表现;二是Java Web Start,主要用作客户端程序的网络发布。接下来的问题便是如何将其融合到J2EE的架构之中去使之成为一个完整的解决方案。
在J2EE体系结构中,后端由EJB组件负责同数据库交互,前台的客户端则通过JNDI(Java Naming and Directory Interface,Java命名与目录接口)在中间层(应用服务器)上查找并调用所需的功能部件。对于B/S模式的应用来说,上述过程发生在Servlet中:
Context ctx = new InitialContext();
Object objRef = ctx.lookup("MySessionBeanHome");
MySessionBeanHome home = (MySessionBeanHome)
PortableRemoteObject.narrow(objRef, MySessionBeanHome.class);
MySessionBean bean = home.create();
通常情况下,Web容器与JNDI服务是整合在同一个应用服务器中的。因此,上面的代码在创建InitialContext时,并没有显式提供Context.INITIAL_CONTEXT_FACTORY和Context.PROVIDER_URL。但是,如果应用程序采用C/S模式来实现,那么就必须要由开发人员为待分发的客户端程序明确提供必要的信息:
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
properties.put(Context.PROVIDER_URL, "iiop://localhost:9001");
Context ctx = new InitialContext(properties);
Object objRef = ctx.lookup("MySessionBeanHome");
MySessionBeanHome home = (MySessionBeanHome)
PortableRemoteObject.narrow(objRef, MySessionBeanHome.class);
MySessionBean bean = home.create();
对于不同的JNDI服务,其初始化参数不尽相同。下面给出了一些常见的JNDI服务初始化参数:
·文件系统JNDI服务
java.naming.provider.url=file://c:/temp
java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory
·IBM WebSphere JNDI服务
java.naming.provider.url=iiop://localhost:9001
java.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory
·BEA WebLogic JNDI服务
java.naming.provider.url=t3://localhost:7001
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
·iPlanet目录服务器(LDAP)
java.naming.provider.url=ldap://localhost:389
java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory
需要注意的是,虽然初始化工厂类在程序代码中可能并没有被直接引用,但是实际运行时JVM也会按照名称将其动态装入。因此,开发人员在分发应用的同时,也应确保初始化工厂类对客户端程序来说是可见的。
至此,我们的解决方案已经有了一个比较清晰的框架:后端采用EJB组件同数据库交互,前台客户端采用SWT类库开发并使用Java Web Start进行部署和发布,中间的应用服务器则通过JNDI将此二者联系起来成为一个整体。
结束语
本文中,我们对基于SWT和Java Web Start的应用程序解决方案给出了一个大致的实现思路。在下一篇文章里,我们将以Windows平台为例,结合IBM的WSAD 5.0,详细讲述此方案的具体实现细节。
参考资料:
·http://java.sun.com/ Java的官方网站
·http://www.eclipse.org/ Eclipse的官方网站
·Eclipse入门 -- Eclipse的使用简介及插件开发,倪大鹏
http://www-900.ibm.com/developerWorks/cn/java/l-eclipse/index.shtml
·SWT:AWT和SWING的强大竞争者,倪大鹏,2003年2月
http://www-900.ibm.com/developerWorks/cn/java/l-swt/index.shtml
关于作者:
李凤桐,河北财华信息技术有限公司软件开发人员,热衷与Java有关的一切技术,现主要从事基于J2EE架构的电子政务相关应用的开发工作。
联系方式:
E-mail: phoenixtrees@hotmail.com