去年,OTN发布了虚拟商场(Virtual Shopping Mall,VSM)系统,这是一个为了向人们展示Oracle产品如何支持用来构建企业应用程序的Java 2平台企业版(Java 2 Platform Enterprise Edition,J2EE)开放标准而设计的示例应用程序。VSM模拟了一个Web站点,在这里,厂商可以建立顾客能够访问并订购商品的在线商店。
在类似VSM的J2EE应用程序中,J2EE服务是在用户浏览器、企业数据库以及原有信息系统之间的中间层执行的。J2EE的核心组件是企业JavaBeans(EJB)、JavaServer Pages(JSP)、Java Servlet以及到信息源的各种接口。
由Oracle印度开发中心(IDC)的四位开发人员构建的USM已经被数千名OTN会员下载过,并且在OTN以及其他以Java为中心的网站和出版物中引起了广泛的兴趣和讨论,这些网站和出版物包括theserverside.com、ejbsig(EJB Special Interest Group,EJB特殊兴趣小组)和Java开发者杂志(Java Developer's Journal)。最近,我与IDC的Reghu Krishna Pillai谈论了VSM及其开发过程。
Robert Hall:你是如何协调团队开发的?你使用了什么工具和方法?
Reghu Krishna Pillai:我们四个--Neelesh Shastry、Sujatha Ranganathan、Shrinivas Bhat和我--来自IDC,我们是从零开始设计和构建这个系统的。在开发和部署阶段,我们使用了Oracle9i JDeveloper集成开发环境(IDE)。开发方法是用于开发J2EE应用程序的软件设计流程--Rational Unified Process (RUP) ,RUP定义了以下关键的开发活动:
需求分析:提供了一个用例图表
面向对象的分析:确定类、对象和交互
体系结构规范:确定MVC模型
详细设计:开发一个类图表
实施:使用Java实施业务逻辑
确认:进行单元和集成测试
组装和部署:生成和部署EAR文件
完成应用程序开发后,我们使用了Oracle9i JDeveloper提供的向导将该应用程序部署到OC4J(Oracle9iAS Containers for J2EE)上。
RH:一些关键的前端问题是什么?你们是如何解决这些问题的?
RKP:和用户界面有关的主要挑战是:
整个应用程序采用一个通用的感观:每个页面被分为诸如页眉、页脚和导航部分等用户界面组件。由于这些用户界面组件在大部分页面中被重复使用,因此我们使用了样式表。
实现灵活的布局管理:为了实现简单的静态布局,我们放弃了使用模板,因为模板的复杂性太高。
实现JavaScript的跨浏览器兼容性。
使用设计模式
RH:你能否谈谈VSM的体系结构和你为了支持它而使用的一些设计模式?
RKP:虚拟商场应用程序基于模型-视图-控制器(Model-View-Contrller,MVC)设计模式,该设计模式在应用程序内分为三种截然不同的功能形式。模型表示应用程序中数据的结构以及对数据的特定操作;视图通过某个应用程序函数将数据以一定的形式展示给用户;控制器根据用户的喜好和模型状态,将用户行为和用户输入转变成调用模型并选择适当视图的应用程序函数。
MVS使管理应用程序的流程变得更加容易。另外,它还可以轻松地支持多个视图,例如,可以在不修改流程逻辑的情况下为手持设备创建视图。修改业务逻辑或视图对彼此只有很小的影响,甚至没有影响。通过MVC为应用程序添加新的用例变得简单,设计也变得更加清晰和更易于维护。
我们已经在内部实施了一个可扩展且功能强大的MVC设计模式。VSM中的视图由在浏览器中提供的JSP构成。模型由EJB和其他可在业务层访问到的支持类构成。至于控制器,我们实施了一个servlet,用于解析和传输由模型和视图产生的请求和响应,这些视图通过一个XML映射文件注册到VSM框架。另外,企业信息系统(Enterprise Information System,EIS)层提供了一个能以一种与实施无关的方式将已有数据和应用资源映射到J2EE应用程序设计上的软件层。这个抽象的数据库层可以作为一个在不同的应用程序间可重复使用的库。
诸如商店、订单、商品和用户等VSM都作为实体Bean来模拟。每个组件都对应一条数据库记录,并具备事务处理功能,容器管理持久性(Container Managed Persistent,CMP)实体Bean是实施的最佳选择,因为它们易于使用,而且它们利用了应用服务器的优化特性。
RH:通过基于Web的用户界面,要在中间层执行业务逻辑,而数据却保存在数据库中,因此如果你不降低网络流量,那么应用程序的性能就会受到损害。你是如何解决这个问题的?
RKP:设计模式就在此处发挥了很大的作用,例如,我们在服务器上实施了一个Session Facade,以为客户端提供一个到底层EJB的统一接口。客户端只需与facade交互,由facade代表它们调用适当的服务器端EJB方法,从而降低了网络流量。
另一个关键是Value Object设计模式(也被称为数据传输对象),在此模式下,一个服务器端对象充当一组相关数据的容器。例如,当一名用户下了一个订单时,应用程序必须管理多个对象和属性,包括订单号、订单日期、客户姓名和发货地址。如果不使用Value Object 模式,应用程序必须对每个属性做远程get-method调用,这就会增加网络流量、提高EJB容器资源的使用率并导致总体性能下降。Value Object模式只需进行一次网络往返就可完成同样的工作。然而,我们发现应该避免对value object不加选择的使用,因为它可能会导致在服务器上建立过多的对象,也会导致不必要的数据传输。
RH:VSM通过根据用户角色显示用户界面来控制对应用特性的访问。例如,商店老板可以访问那些使他们能够上载文件的页面,而商场客户却不能访问。你是怎么实现这点的?
RKP:我们使用了Servlet过滤器。过滤器就相当于Web应用程序的拦截器,因此它们可用来解决诸如日志、安全性和缓存等交叉问题。VSM使用了一个过滤器来处理用户请求并返回正确的页面。
在VSM中采用的策略是通用的,可以重复用于任何Web应用程序。它是一个可插式组件,因为它是围绕servle
t过滤器实施的。这些过滤器为基于servlet的应用程序添加了新特性,而且你可以在不接触已有的servlet代码的情况下对它们进行定制和扩展。例如,如果一个应用程序需要控制对其Web页面的访问,我们只需在该应用程序的web.xml文件中添加一行代码就可以实现这个目的。
RH:你发布了一个信用卡校验组件,作为一个可以从VSM示例应用程序访问的Web服务。你为什么建立一个独立的Web服务而不是将该功能直接构建到应用程序中?
RKP:Web服务非常适合于集成不同类型的应用程序和业务。这种方法使VSM更灵活、更易于维护,并且是模块化的而不是单一的。实际上,这个信用卡校验服务可以被一个支付网关提供商提供的实际支付服务所代替。因此,当我们需要一个有金融交易支持的商业VSM时,就可以很容易地集成第三方提供的Web服务。
选择XML RH:所有提供给VSM用户或从VSM用户接收的数据都是XML格式的,这是为什么?
RKP:我们选择XML是因为它正在成为电子数据交换(Electronic Data Interchange,EDI)的开放标准。通过使用XML,我们的应用程序可以很容易地集成后端功能和其他企业应用程序,如果有的话。
XML用于VSM中的报表编制。通过从数据库表中提取表格数据然后将其转换成结构化XML的内置支持,Oracle9i数据库使我们的工作变得更加简单。另外,XML使我们可以将内容与表示层分离开,从而使应用程序更加灵活。这里有个例子:在当前的实施中,商店老板可以获得一个HTML格式的报表视图。但是,因为这个报表是XML格式的,所以可以很容易地在报表上使用样式表和格式化对象,从而产生不同格式(如Adobe PDF和Microsoft Word)的报表。
RH:Java和J2EE仍在不断地发展,VSM是否展示了它们的最新特性?
RKP:在VSM的第一个版本中,我们展示了J2EE 1.2的特性和少量J2EE 1.3的特性,比如servlet过滤器。我们当前正在开发的版本将展示各种J2EE 1.3的特性及其国际化特性。
另外,为了答复来自OTN社区的反馈意见,我们正在构建一个基于BC4J(Business Components for Java,Oracle用于建立可伸缩的高性能J2EE应用程序的基于标准的服务器端框架)的VSM版本。使用BC4J和标准的J2EE组件进行开发是两个不同的开发范例,这两种方法各有其优点和缺点。BC4J是一个纯Java框架,它实施了各种J2EE设计模式,使J2EE应用程序的开发更快、更容易。因为在BC4J中开发的应用程序是纯Java的,所以它们可以在各种应用服务器上运行。(编者注:BC4J VSM现在可以在otn.oracle.com/sample_code/tutorials/bc4jvsm/bc4jvsmtoc.htm上找到)
自行了解有关内容
OTN会员可以下载各种VSM版本,包括全部的源代码、安装指导、用户指南和教程。要想获得更多信息,请访问OTN的示例代码页面。