J2EE中的设计模式之三

本文探讨了在J2EE应用中使用SessionFacade模式解决客户端与EJB交互复杂性的问题。通过此模式可以有效地管理用户交互流程,并减少客户端因EJB变更而需频繁修改的情况。
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 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中的设计模式之五
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值