站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题J2EE宠物商店 (2)

J2EE宠物商店 (2)

摘要: J2EE宠物商店 (2)

3.视图选择

视图的选择是通过控制来完成的。控制根据实际情况分析用户显示视图的ID,运行模板把整个视图显示出来,如图6所示。

图6 视图选择

模型

模型的状态是视图显示的数据来源,也是控制的具体对象。在J2EE中,描述模型的状态采用三种EJB:无状态会话EJB、有状态会话EJB和实体EJB。

1.辅助对象

有两种主要的辅助对象:数据库访问对象和值对象。对于实体EJB来说,数据库访问对象封装了数据库访问的方法,如AccountDAO等。对于所有EJB的属性值,则都由一个值对象来封装,如ShoppingCartModel、AccountModel等。

2.EJBs

本示例用到的EJBs如图7所示。

图7 Java Pet Store使用到的EJBs

3.模型状态到视图的绑定

一个模型对应多个视图,实现视图的绑定方法是:ModelUpdateListener和ModelUpdateNotifier实现了一种注册-监听模式,通过调用监听器的performUpdate方法来使视图得到更新。例如:

<table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"> <tr> <td bgcolor="e6e6e6" class="code">

public class AccountWebImpl extends AccountModel
implements ModelUpdateListener{
 private ModelManager mm;
 private Account acctEjb;
 public AccountWebImpl(ModelManager mm){
  super(null,null,null};
  this.mm=mm;
  mm.addListener(JNDINames.ACCOUNT_EJBHOME,this);
 }
 public void performUpdate(){
  if(acctEjb==null)  {
   acctEjb=mm.getAccountEJB();
  }
  try{
   if(acctEjb !=null)copy(acctEjb.getDetails());
  }catch(RemoteException re){
   throw new GeneralFailureException(re);
  }
 }
}
</td> </tr> </table>

控制

控制负责处理用户请求、调用相应的模型、更新模型的状态、刷新视图以及返回用户合理的页面。示例的所有控制对象如图8所示。

图8 控制对象图

1.RequestProcessor

RequestProcessor接收并处理用户的所有请求,调用RequestToEventTranslator对象把请求转换成预定义的事件,在事件处理完成后,进行视图更新。 代码如下所示:

<table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"> <tr> <td bgcolor="e6e6e6" class="code">

public class RequestProcessor{
     private ShoppingClientControllerWebImpl scc;
     private ModelManager mm;
     private ModelUpdateNotifier mun;
     private RequestToEventTranslator eventTranslator;
     private SecurityAdapter securityAdapter;
     public void init(...)  {
      mm = (ModelManager)session.getAttribute("modelManager");
      mun = mm;
      SCC = new ShoppingClientControllerWebImpl(session);
      eventTranslator= new RequestToEventTranslator(this,mm);
     }
     public void processRequest(HttpServletRequest req){
      checkForWebServerLogin(req);
      EStoreEvent event = eventTranslator.processRequest(req);
      if (event != null){
       Collection updatedModelList = scc.handleEvent(event);
       mun.notifyListeners(updatedModelList);
      }     
     }
    }
</td> </tr> </table>

2.ShoppingClientControllerWebImpl

ShoppingClientContronerWebImpl是调用EJB层的ShoppingClientController代理对象,代码如下所示:

<table width="550" border="1" cellspacing="0" cellpadding="2" bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"> <tr> <td bgcolor="e6e6e6" class="code">

public class ShoppingClientControllerWebImpl{
     private com....ejb.ShoppingClientController sccEjb;
     private HttpSession session;
     public ShoppingClientControllerWebImpl(HttpSession session){
      this.session = session;   
      ModelManager mm= (ModelManager)session.getAttribute("modelManager");
      sccEjb = mm.getSCCEJB();    
     }
     public synchronized AccountModel getAccount(){
      return sccEjb.getAccount().getDetails();
     }    
     ......   
     public synchronized Collection handleEvent(EStoreEvent ese){
      return sccEjb.handleEvent(ese);
     }
     public synchronized void remove()  {
      sccEjb.remove();
     }
    }
</td> </tr> </table>

3.ShoppingClientController

ShoppingClientController是有状态的会话EJB,它为每个用户建立一个单独的实例,负责购物车和账号的生命周期,并负责处理事件。同时它也控制状态机StateMachine的生命周期。代码参见赛迪网http://linux.ccidnet.com的期刊浏览2003年第6期。

4.StateMachine

StateMachine实现核心的业务逻辑,它负责改变模型的状态,包括处理每个业务事件的方法。代码参见赛迪网http://linux.ccidnet.com的期刊浏览2003年第6期。

  小结

  J2EE网站的开发方法,即是Internet的开发方法。Internet开发的发展可以划分为三个阶段:第一阶段是将业务逻辑和表现逻辑完全集成在一起,采用HTML、JSP和Servlets技术开发;第二阶段是将业务逻辑和表现逻辑分开,采用HTML、JSP、Servlets、JavaBeans Compoments和Custom Tags技术开发;第三个阶段是MVC设计模式(J2EE的开发方法)。今天,MVC设计模式已成为Internet开发发展的主流。无论是通过第一阶段开发的应用,还是通过第二阶段开发的应用,都会面临着开发人员的分工、应用的可维护性和可扩展性及可测量性的问题。为此,我们在设计阶段关心的重点是系统结构的复杂程度、代码之间的耦合度、代码的易维护性、应用框架的可重用性、EJB组件的可重用性和易测试性,以及不同技能开发人员的分工等。用纵观全局的眼光来看,在Internet系统开始设计的时候,就要考虑开发、运行、维护阶段的问题。
↑返回目录
前一篇: J2EE设计模式学习笔记之--实际的数据存取
后一篇: J2EE之类的概念