您的位置:首页 > 其它

J2EE中的设计模式之三

2008-05-23 03:20 211 查看
google_ad_client = "pub-8800625213955058";

/* 336x280, 创建于 07-11-21 */

google_ad_slot = "0989131976";

google_ad_width = 336;

google_ad_height = 280;

//

3. Session Fa?ade

  a. 问题

  前台控制给出了一个基于MVC的,能有效管理用户与J2EE应用之间进行的复杂交互。这个模式可以使处理页面的现实顺序和用户的并发请求变得简单。并且使增加和改变页面现实变得更加容易。

  另外一个常见的问题是,当EJB或者业务逻辑发生变化的时候,应用的客户端也必须随之改变。我们来看一下这个问题。

  一般来说,为了表现一个账户中的用户,我们使用一个业务逻辑来表示账户中的信息,象用户名和口令,再用一个EJB来管理用户的个人信息,象爱好,语言等。当要创建一个新的账号或者修改一个已经存在的账号时,必须访问包含账号信息的EJB,读取个人信息,修改并且保存,这样的一个流程。

  当然,这只是一个非常简单的例子,实际情况可能比这个复杂的多,象查看用户定制了哪些服务,检验客户信用卡的有效性,存放订单等。在这个案例中,为了实现一个完整的流程,客户端必须访问账户EJB来完成一系列适当的工作。下面的例子显示了一个Servlet客户端如何来控制一个用户订单。

  A servlet that does the workflow required for placing an order

// all required imports;

// exceptions to be caught appropriately wherever applicable;

// This servlet assumes that for placing an order the account and

// credit status of the customer has to be checked before getting the

// approval and committing the order. For simplicity, the EJBs that

// represent the business logic of account, credit status etc are

// not listed

public class OrderHandlingServlet extends HttpServlet {

// all required declarations, definitions

public void init() {

// all inits required done here

}

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws IOException, ServletException {

// other logic as required

// Get reference to the required EJBs

InitialContext ctxt = new InitialContext();

Object obj = ctxt.lookup("java:comp/env/ejb/UserAccount");

UserAccountHome acctHome = (UserAccountHome)

PortableRemoteObject.narrow(obj, UserAccountHome.class);

UserAccount acct = acctHome.create();

obj = ctxt.lookup("java:comp/env/ejb/CreditCheck");

CreditCheckHome creditCheckHome = (CreditCheckHome)

PortableRemoteObject.narrow(obj, CreditCheckHome.class);

CreditCheck credit = creditCheckHome.create();

obj = ctxt.lookup("java:comp/env/ejb/Approvals");

ApprovalsHome apprHome = (ApprovalsHome)

PortableRemoteObject.narrow(obj, ApprovalsHome.class);

Approvals appr = apprHome.create();

obj = ctxt.lookup("java:comp/env/ejb/CommitOrder");

CommitOrderHome orderHome = (CommitOrderHome)

PortableRemoteObject.narrow(obj, CommitOrderHome.class);

CommitOrder order = orderHome.create();

// Acquire the customer ID and order details;

// Now do the required workflow to place the order

int result = acct.checkStatus(customerId);

if(result != OK) {

// stop further steps

}

result = credit.checkCreditWorth(customerId, currentOrder);

if(result != OK) {

// stop further steps

}

result = appr.getApprovals(customerId, currentOrder);

if(result != OK) {

// stop further steps

}

// Everything OK; place the order

result = order.placeOrder(customerId, currentOrder);

// do further processing as required

}

}

  以上的代码显示了一个单个的客户端。如果这个应用支持多种客户端的话,必须为每一个客户端制定一种处理方法来完成工作流程。如果有一个EJB的实现流程需要改变的话,那么所有的参与这个流程的客户端都需要改变。如果不同的EJB之间的交互需要改变的话,所有的客户端都必须知道这一点,如果流程中需要增加一个新的步骤的话,所有的客户端也必须随之修改。

  这样一来,EJB和客户端之间的改变变得非常困难。客户端必须对每个EJB分开进行访问,致使网络速度变慢。同样,应用越复杂,麻烦越大。

J2EE中的设计模式之一

J2EE中的设计模式之二

J2EE中的设计模式之三

J2EE中的设计模式之四

J2EE中的设计模式之五
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: