0引言
在当今大型企业级Web 应用领域,J2EE 平台正日益得到广泛的应用和长足的发展。而将面向对象的MVC 设计模式与J2EE 多层体系结构相结合,可以形成一种快速高效的开发模式。当前比较流行的Struts 就是比较成熟的基于J2EE 的MVC 模式Web 应用框架[1]。它将业务逻辑和表现逻辑进行分离和封装,并提供了标签库(Taglib )。
由于Struts 框架的模型组件部分没有很好地实现,没有提供数据持久层。因此在实际应用中,选择基于对象关系映射技术的Hibernate 架构作为持久层的解决方案[2-3]。针对Struts 框架不具备很好的视图层适应性,刘冰等人[4]引入可扩展的样式语言(XSL )技术,利用XSLT 强大的转换功能,把它和Struts 结合在一起,对Struts 的视图部分进行改进。针对Struts 在事务处理、身份认证、权限控制等关键服务方面的不足,娄晓亮[5]等人提出了基于Struts 扩展的StrutsX 框架。
但是在Struts 中,所有的数据封装和业务都集中在模型组件进行处理,而没有能分割企业级的通用业务组件,大大降低了解耦合性。而对于大型企业级应用来说,不管是硬件还是软件设施,进行最大化重用是减少开支和提高工作效率的重要途径。针对这一需求,本文通过扩展Struts 框架,提出一个新的架构PBE (presentation business enterprise ),通过Fa çade 模式和Java 中的动态代理机制,有效地将企业级通用业务组件封
装并为上一层提供一个简单的方法调用,降低了开发复杂度,提高开发效率。PBE 框架已经成功运用于一个大型企业的报表发布系统。
1传统Struts 框架及其不足
Struts 是一个基于Sun Java EE 平台的MVC 框架,是由一
组相互协作的类,Servlet 和JSP 标记库组成的。它的框架如图1所示。
这个框架的视图组件就是由一组JSP 页面,Struts 提供的Taglib 标签和ActionForm 对象组成,其中用户的请求参数被封装成ActionForm 对象,在JSP 页面中,开发者利用Taglib 标签把模型信息从ActionForm 对象中提取出来并创建HTML 表单。ActionForm 对象用于在视图组件和控制器组件间传递表
收稿日期:2009-06-29;修订日期:2009-08-31。
信息化技术
单数据。ActionForm对象被ActionServlet转发给Action,Action 根据ActionForm对象里面的请求参数处理用户的请求。
控制器组件由两个部分组成:系统核心控制器和业务逻辑控制器。系统核心控制器对应于ActionServlet类,它负责拦截所有的HTTP请求,然后根据用户请求决定是否要转发给业务逻辑控制器。业务逻辑控制器则负责处理用户的请求,对应于Action类。它负责通过它的execute()方法处理一个请求并返回一个ActionForward对象,这个对象定义了下一步将控制权限转移到哪里来给出正确的响应。
模型组件代表应用的业务逻辑和数据。其实Struts并没有专门设计的模型组件,但是它允许使用其它模型框架来处理应用的业务领域,常见的如EJB和JDO,以及常规的Java Bean和ORM[6]。这些模型框架封装了底层的业务逻辑,包括数据库访问等。
可以看出,Struts框架只是对J2EE Web层的基本API进行了封装,例如业务逻辑与表现逻辑的分离、动
态页面显示逻辑与静态HTML代码的分离,但是对底层数据的封装则和业务逻辑处理混杂于模型组件当中,没有做到有效的解耦合。
在大型企业中,为了减少硬件和维护成本,底层的数据服务往往都是通用组件服务,包括数据库服务、邮件服务和报表服务等。因而,企业级的应用系统需要和底层数据服务解耦合,支持更高效的集成。如果每个系统都需要各自实现了一套接口与底层数据通信,开发效率将大大降低。因此我们选择为这些通用的组件开发一个统一的接口,然后在Struts的模型组件中通过这些接口来实现对数据库等底层数据的访问。
2基于Struts扩展的企业级应用框架PBE
在前文分析的Struts框架的不足的基础上,本文提出了一个在传统Struts框架基础上进行改进后的新框架。在这个框架中,我们引入了Façade模式,对需要调用的底层数据操作进行了统一封装,仅仅把一个接口暴露给模型组件,从而使子系统更便于使用,也降低了系统间的耦合度。同时我们也利用Java中的动态代理机制,把表现层需要调用的多种服务的方法统一交由InvocationHandler的invoke()方法进行处理。我们将这种框架命名为PBE框架。
2.1Façade模式及其在EJB中的应用
设计模式对Facade模式描述为:“为子系统中的一组接口提供了一个一致的界面。Facade定义了一个更高层次的接口,使子系统更容易使用[7]。”一个Facade对象为一组类提供了一个简单的接口,使得上层能够通过这个接口来调用低层类的方法,而不需要知道具体方法的名字和参数。
在Struts的模型中,EJB负责处理复杂业务逻辑和数据访问,控制器组件必须通过它来访问实体Bean。在EJB的设计中,Session Bean应用Facade模式,把构成子系统的一套业务对象“包装”在Session Bean中[8]。Facade对象抽象了低层业务对象的交互,并提供给EJB客户端一个接口服务层,即它对客户端隐藏了参与者之间复杂的交互。当业务对象的方法改动时,客户端可以保持不变。这就减少了客户端和业务对象之间的耦合度,同时客户端也不必管理事务的细节。EJB客户端对多个业务对象的远程调用变成了对一个Facade对象的调用,它不必知道哪些业务对象在工作,因为由Facade对象负责将具体任务转发给各个对象组件去实现,而且这些调用都变成了Session Bean对象的本地调用。Session Bean的工作原理如图2所示。
对于底层的通用数据服务来说,为了将企业级的应用系统与之最大程度地解耦合,需要它们有各自的API供EJB调用。我们需要把这些API进行统一封装,在数据服务层和EJB 客户端之间加入Façade层,提供一个统一的接口给EJB客户端进行调用。
2.2Java中的动态代理机制
Java中动态代理机制的具体工作原理其实就是动态代理类是由flect.Proxy类在运行期时根据接口定义,采用Java反射功能动态生成的。它和flect.Invocation-Handler相结合,可以加强现有类的方法实现。自定义Handler 实现InvocationHandler接口,自定义Handler实例化时,将实现类传入自定义Handler对象。自定义Handler需要实现invoke 方法,该方法可以使用Java反射调用实现类的实现方法。Proxy 类动态的根据需要代理的接口和Handler生成一个代理类,该代理类会继承Proxy类,并实现所有指定的接口(在参数中传入的接口数组),然后再利用指定的classloader将代理类加载进系统,最后生成这样一个类的对象,并初始化该对象的一些值。初始化之后将对象返回给调用的客户端,这样客户端拿到的就是一个实现你所有的接口的Proxy对象。Java动态代理工作机制如图3所示。
在表现层,Struts控制器组件中的Action类需要向EJB对象调用多种服务,而EJB只提供了惟一的接口方法给上一层,这样就产生了问题。Java中的动态代理类Proxy的最大好处就是把被代理对象的所有方法统一由InvocationHandler的in-voke()方法代理,然后由这个统一的方法去调用EJB暴露给上层的惟一的方法,所以在表现层中加入Proxy模块刚好可以解决这个问题。
2.3PBE框架
PBE框架分为三层,即表现层(Presentation Tier),业务层
图2Session Bean的工作原理
EJB客户端
远程调用Session
Bean
业务对象
业务对象
业务对象
(Business Tier)和企业级服务层(Enterprise Service Tier)。
表现层包括了Struts框架的视图组件和控制器组件,并且在这一层中加入了代理模块Proxy,业务层则包括了原来Struts 框架中的模型组件EJB和新引进的Facade模块。企业级服务层包括了企业级数据服务的通用组件,如数据库,报表生成服务,邮件服务等。PBE框架如图4所示。
下面对PBE特有的组成模块的设计和实现进行分析。
2.3.1Façade模块
业务层为表现层提供了EJB接口以供调用,并且利用Façade模式为下面的企业级服务层创建了Façade对象。因为企业级服务层包含了多种类型的数据服务,包括数据库,报表生成服务,邮件服务等。这些数据服务都提供了各自的一套API供上一层的EJB调用。通过利用Façade模式对这些API 进行封装,就可以提供一个统一的接口为EJB服务。
EJB的Session Bean则刚好可以继承这个Façade类,为上一层提供了可供调用的接口。我们在这里正是运用Façade模式将这些API统统封装进EJB的Session Bean中,并为上一层提供一个统一的接口方法。
2.3.2Proxy模块
由于在表现层Action的实际调用中,我们需要调用许多种类型的Service接口方法。当我们直接去调用EJB的Session Bean时,由于它最后只暴露一个统一的接口给上层调用,所以我们也需要将这些调用的Service接口的方法统一到一个方法调用中。Java中动态代理机制的最大好处在于接口中声明的所有方法都被转移到一个集中的方法中处理。因此,我们将这些Service接口方法统一用一个Proxy类代理,在Action类中调用这些方法时,系统实际是去调用了Proxy类的invoke()方法,这样就可以由这个代理类直接与EJB打交道,调用EJB 提供的统一的接口方法。3应用案例
Report Generation Center是一个运行于IBM Websphere平台上的应用,为客户提供后台数据的维护和报表生成服务。Report Generation Center的体系架构如图5所示。
Report Generation Center系统就是按照PBE框架进行开发的,因此它也分为三层结构:企业级服务层,业务层和表现层。
3.1企业级服务层
这一层包括了诸如数据库,报表生成服务以及邮件服务等企业通用的组件服务。我们在这里对底层的数据库数据进行持久化处理,并采用Hibernate技术把底层数据库的数据与Java对象间建立映射关系,用D
AO(data access object)模式访问这些持久化数据,封装了数据访问方式,提供了一个名叫DBService的API。而报表服务和邮件服务也分别有各自的API,分别是RPTService和EmailService。这些API提供了各自的接口和方法供上一层对象调用。
3.2业务层
这一层包括了在Struts中作为模型组件的EJB对象以及Façade组件。由于企业级服务层提供了3种类型的Service,我们需要为这些服务创建一个统一的接口提供给EJB对象,因此我们利用Façade模式为这3种不同类型服务的API创建
了统一的Façade类,名为ServiceFacade,EJB的SessionBean继承了这个类并为上层提供了统一的调用方法invoke()。
3.3表现层
由于业务流程复杂,报表系统需要对后台数据进行录入,查询,抽取以及汇总等等处理,这样就要求能够灵活设计和调整页面跳转。所以表现层最后选择采用Struts框架的视图组件和控制器组件为核心,体现层次化、组件化的设计思想,将业务逻辑和表现逻辑相分离,应用模块化,可以根据实际需
要,任意地组合、修改、删除和添加。
Struts框架需要实现多种类型的业务和数据服务Action。报表系统不仅需要访问后台数据库服务器进行数据访问操作,而且还要访问报表生成服务器以及邮件服务器。这些Action 分别是DBAccessAction,ReportAction和EmailAction。但是业务层的EJB对象为表现层只提供了单一的调用方法,因此为了与之匹配,我们采用了Java中的动态代理技术为这些Action 创建了统一的代理类ActionProxy,并向下提供了统一的方法invoke()。当Action调用具体的服务时,都被这个代理类截获具体方法的名称和参数并统一交由代理类的invoke()方法处理。这个invoke()方法去调用EJB对象提供的invoke()方法。这个ActionProxy类就是PBE框架中的Proxy模块。
4实验结果与分析
我们把应用Struts框架开发Report Generation Center与应用PBE框架开发这个项目来做一个开发成本上的对比。在没有应用PBE框架前,开发人员必须为这个项目开发单独的底层数据服务组件,整个项目需要耗费30个人月的工作量。而采用PBE框架进行开发,就可以采用现成的通用服务组件,整个项目只需耗费20个人月的工作量。同时,通过应用PBE框架,报表平台的表现层和逻辑层可以并行开发,这也提高了开发效率。我们可以从图6中看出差别。
通过重用现成的企业级通用服务模块,可以大大减少开发的成本,提高了代码的复用率。PBE框架中的底层企业级通用服务只需要开发一次,就可以在所有应用这个框架的项目中使用。图7展示了企业级通用组件在整个项目中所占比例。
PBE框架的应用也提高了系统的可扩展性。把在传统Struts框架下增加一个统计生成报表数量的功能与在PBE框架下增加一个同样的功能做一个可扩展性的对比。在应用传统Struts框架开发时,视图、控制器和模型三层都会受到影响,尤其是模型层,需要开发出一个全新的接口供上层调用,而应用了PBE框架后,只需要在专注于表现层和业务层,工作量大大减少。表1展示了应用PBE架构前后可扩展性的比较结果。可以看出,PBE框架可以有效减少工作量,同时功能变化的影响得到有效控制。
5结束语struts框架是干什么的
随着Web应用系统开发的日益复杂,如何选用一个合适高效的Web应用框架对于提高系统的开发效率和可扩展性是至关重要的因素。Struts是一种典型的MVC应用框架,并且得到广泛的应用,逐渐趋于成熟。但是针对于具体系统的具体模块,它还显得不够完整和单薄,需要进行修改和扩充。
本文在Struts框架的基础上提出了一个面向大型企业级应用的框架PBE,针对底层企业级通用服务,采用Façade模式开发统一接口提供给Struts模型中的EJB对象,同时也采用Java 的动态代理机制为Struts控制器中的Action对象提供了统一的代理类接口和对EJB对象的惟一的调用方法。在工程实践中,PBE框架很好地应用于Report Generation Center项目中。通过应用本框架,报表平台的前台表现层和后台逻辑处理层可以并行开发,底层企业级通用组件可以得到最大化重用,大大提高了开发效率,同时也提高了软件的可维护性和可扩展性。
参考文献:
[1]龚永生.当前流行的J2EE WEB应用架构分析[DB/OL].
/developerWorks/cn/java/l-j2eeArch/.
[2]阎娟娟,陈波,王乐.基于Struts和Hibernate的J2EE架构的研
究[J].计算机工程与设计,2008,29(21):5498-5501.
[3]高昂.基于Hibernate与Struts框架的数据持久化应用研究[J].
计算机应用,2005,25(12):2817-2819.
[4]刘冰,李正凡.基于Struts扩展框架的Web应用研究[J].计算机
应用,2008,28(10):2619-2621.
[5]娄晓亮,李京.StrutsX:一种面向高层复用的Web应用框架[J].
计算机工程与应用,2005,41(25):175-179.
[6]孙卫琴.精通Struts:基于MVC的Java Web设计与开发[M].北
京:电子工业出版社,2005.
[7]Elisabeth Freeman,Eric Freeman.Head First Design Pattern[M].
南京:东南大学出版社,2005.
[8]须文波,黄渌.EJB中的Facade模式原理[J].计算机工程与设
计,2004,25(12):2185-2187.
表1应用PBE框架前后扩展性的比较结果
扩展新功能影响范围工作量
应用传统Struts框架
应用PBE框架
所有三层(视图层、控制层和模型层)
表现层、业务层
15个人日
10个人日
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论