【IT168 技术文档】
3-1 PetStore概述
PetStore是Sun公司在J2EE平台上开发的一个应用样例,是Java软件在J2EE的蓝图程序,它示范了如何利用J2EE1。3平台的性能去开发灵活、可升级的分布式平台企业应用系统。PetStore是一个运行在Web上的,为网络客户提供宠物信息浏览、网上订单和管理等功能的网上宠物店,在技术上使用了J2EE中的大部分企业组件和优秀的设计模式,提供了一套有高灵活性扩展性和可升级的完善J2EE开发框架。
PetStore共有4个子系统组成:
·petstore Web Site 该部分是petstore中的核心,客户登录系统进行选择,定购,提交定单等
·petstore admin 该部分是系统的管理功能
·Order processing center 定单调度中心,对客户提交的定单进行处理
·PetStore supplier 为产品供应者提供的维护画面
在这里主要以WebSite为主进行分析(以下petstore均指该子系统),它是怎样进行分层处理的。
3-2 Petstore体系架构
我们按照层的架构模式进行分析,主要从Tiers和layer角度进行考虑。
3-2-1 Layer层
3-2-1-1 概述
PetStore是基于Web应用系统,它的客户端使用Broswer,然后是Web层的应用,业逻辑的层(由EJB实现),资源管理层(包括数据库,JMS,JavaMail等)。具体又细分为以下几层。
(PetStore分层图)
·客户请求浏览页面,一般Web层的View由JSP组成,并且使用了大量Taglib
·把每个请求映射到某个HTMLAction类,来响应它。HTML Action类是一个标准的类, 执行选择的HTML Action
·WCC 是由WebClientController完成(实现类为WebClientControllerImpl),它实际是SUN核心模式的Business Delegate层
·ECC 是EJBClientController,它实际是核心模式Session Facade
·EjbAction层执行EJB Action,传送event参数进来。EJB Action读event里面的参数,并且操纵EJB或者别的数据源来执行相应的商业操作。
·业务集成层,由通过DAO,EntityBean,JMS等访问相应的资源。
具体的详细的结构如下:
(PetStore详细结构)
3-2-1-2 实现
在Web层它应用了著名的MVC模式,V由JSP来实现,为了业务逻辑和表示的分离,一般结合JSPTagLib。它把请求提交到相应的处理MainServelet,然后准发到RequestProcessor,他根据读取mappings.xml,的配置信息,生成相应的处理类Action如:
<url-mapping url="createuser.do" screen="create_customer.screen" isAction="true">
<action-class>com.sun.j2ee.blueprints.petstore.controller.web.actions.CreateUserHTMLAction</action-class>
</url-mapping>
每个Action一般包括以下几种方法(doStart, perform, doEnd),如果perform只需对请求的处理,如果处理的结果不需调用EJB的业务逻辑,只需返回即可,否则把请求组织成相应的Event,通过WCC转发到后台的业务逻辑层。代码见下:
public void processRequest(HttpServletRequest request) throws HTMLActionException, EventException, ServletException {
Event ev = null;
String fullURL = request.getRequestURI();
// get the screen name
String selectedURL = null;
ServiceLocator sl = (ServiceLocator)request.getSession().getAttribute(WebKeys.SERVICE_LOCATOR);
WebClientController wcc = sl.getWebClientController();
HTMLAction action = getAction(selectedURL);
if (action != null) {
action.setServletContext(context);
action.doStart(request);
ev = action.perform(request);
EventResponse eventResponse = null;
if (ev != null) {
eventResponse = wcc.handleEvent(ev);
}
action.doEnd(request, eventResponse);
}
}
通过WCC把Event转发到EC,这里WC是delegeteBussiness层:
public class WebClientControllerImpl implements WebClientController {
public synchronized EventResponse handleEvent(Event ev)
throws EventException {
return ccEjb.processEvent(ev);
}
}
EC是Fa?ade层,如下,
public class EJBClientControllerEJB implements SessionBean {
protected StateMachine sm;
public EventResponse processEvent(Event ev)
throws EventException {
return (sm.processEvent(ev));
}
}
然后根据相应的Event的类型使用不同EJBAction来完成相应的业务逻辑:
public EventResponse processEvent(Event ev) throws EventException {
String eventName = ev.getEventName();
String actionName = null;
EventResponse response = null;
if (eventName != null) {
actionName = getActionName(eventName);
EJBAction action = null;
action = (EJBAction)Class.forName(actionName).newInstance();
if (action != null) {
action.init(this);
// do the magic
action.doStart();
response = action.perform(ev);
action.doEnd();
}
}
return response;
}
每个具体的EJBAction完成自己的具体的业物逻辑,如果处理数据对象,则使用的相应的实体对象(data module)。具体的层次调用过程,见下图:
(EJBAction业务逻辑)
3-2-2 Tier层
3-2-2-1 概述
PetStore Layer的设计分为以下几层,最底层为操作系统和网络服务,然后是基于J2EE服务器提供的系统服务层,上面是framework,Component层,包括WebApplicationFrameWork,以及commons业务逻辑,工具类等组成。最上层才是具体的业务实现模块具体见下图:
(PetStore设计分层)
3-2-2-2 实现
Petstore主要开发了两层,其中业务核心层,主要有几部分:
·WAF (Web Application Framework)
·ApplicationControl 和Presentation (主要指JSP TagLib)
·Components(如各种实体对象如customer,Account,等)
·Business Logic Data各种常用的工具类
层的业务逻辑包括以下几个部分:
登录和注册,购物车模块,登录模块等。
我们以WAF为例介绍业务共同层的作用, 开发者,可以基于这个框架,添加自己的代码和实现,下面红框内为WAF核心,如果增加新的业务功能只需增加相应的绿色部分。
(层的业务逻辑)
同时其他的components提供了对JMS,Mail等的处理。
4-1 外观模式(Facade)
外观模式的意图就是为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。其实层模式的每层之间的经常使用Facade来进行封装成一致的接口供上层进行调用。如PetStore的EJB层的ECC就是Facade模式的应用。
public interface EJBClientController extends javax.ejb.EJBObject {
public EventResponse processEvent(Event ev) throws EventException, RemoteException;
}
J2EE核心模式的SessionFacade 模式定义了一类高层的业务组件,用于封装并集中较低层次业务组件之间的复杂交互。它为客户端提供单一接口,用于访问应用程序或应用程序子集的功能。它还把较低层次的业务组件彼此分离开来,从而使设计更具灵活性和可理解性。通过远程接口的细粒度访问是不可取的,因为这会增加网络通信量和滞后时间。多个细粒度调用会产生许多网络通信,而且会降低性能,因为远程调用的滞后时间很高。引入Session Facade会减少网络通信和滞后时间,因为对细粒度业务对象的所有访问都是本地的。见下图:
(J2EE核心模式的SessionFacade 模式)
4-2 中介模式 (Mediator)
外观模式的意图就是用一个中介对象来封装一系列的对象交互。中介模式使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。在层架构模式中有时会使用该设计模式,使层之间的通信仅知道中介者并且只与通信,而不是层直接调用其他系统。使用中介模式如下:
(中介模式)
总结
本文介绍了软件体系架构模式的层模式,分析了它的结构,特点,实现,以及优缺点。然后介绍遵循层模式的Architectural cube理论,结合J2EE的体系架构特点,剖析层模式是怎样应用的。最后以PetStore为例, 简单阐述怎样应用该模式在实际J2EE系统之中。