技术开发 频道

软件体系架构模式在J2EE中的应用(下)

【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系统之中。
0
相关文章