kaiyun官方注册
您所在的位置: 首页> 其他> 业界动态> Web与EJB的分离

Web与EJB的分离

J2EE设计模式的使用
2008-12-30
作者:陈道成
1 设计背景
目前, 业务层和实现层之间的必要分隔已成为应用程序" title="应用程序">应用程序规划和实现中最复杂的问题之一。为了实现这一分隔,Brett McLaughlin 以业务接口(Business Interface)模式为基础,用JavaBean来处理业务逻辑上的 Web 层抽象。而这里,我们将使用业务接口模式和Session Bean ,使 Web 层与 Enterprise JavaBeans 组件保持松散耦合。通过将表示业务逻辑的代码接口中抽象出业务逻辑实现,以解决核心问题。
2设计实现" title="设计实现">设计实现
首先我们引入业务接口模式,业务接口模式的实现允许我们提供特定于业务逻辑的接口,用于与Session Bean 交互。在 pro _1中,我们定义一个业务接口Istdudent, 可以看出IStudent 接口不包含任何 EJB 语义, 所有的实现和 EJB 细节都在Session Bean 内处理, 由Session Bean 实现该接口。
pro_1. Student 业务接口
package edu.biti.stu;
import edu.biti.exceptions.NoStudentException;
import java.rmi.RemoteException;
public interface Istudent
{ public String getName() throws RemoteException;
public long getStuNo(String category) throws RemoteException;
public boolean identify(long stuNo) throws RemoteException;
}
现在,让我们看一下Web 层是如何访问 Istudent 接口和Session Bean的:
pro_2. 使用 IStudent 接口
StudentHome stuHome =
(StudentHome)EJBHomeFactory.getInstance().
lookup("java:comp/env/ejb/StudentHome",
StudentHome.class);
IStudent stu = stuHome.create();
在pro_2通过查询 Student bean 的 home 接口,然后从 home 接口获得 IStudent 接口的实现。我们可以看到上述代码并没有采取常用访问EJB的放方式--装入 JNDI 初始上下文、手工获得 home 接口,随后直接处理 企业bean—而是在此基础上做了进一步改进, 用到另外一个类EJBHomeFactory,我想凡了解设计模式" title="设计模式">设计模式的,对此一定不会陌生,的确他用到了另一种设计模式—工厂模式(Factory)。但它存在一个基本的缺点是:Web 层与 EJB 组件,尤其与 Student Session Bean(不仅是业务接口),并没有完全分离。假如我们不用EJB,而使用 Java Data Object(JDO)或用EJB的一个新版本时, 那么这时应用程序代码都必须作较大的改动! 虽然目前比较容易编写紧密耦合的代码,但这样做必然是以牺牲应用程序的使用寿命" title="使用寿命">使用寿命为代价的。那么如何实现层次清楚的系统的体系结构(这是必然趋势), 继而使应用程序更具维护性和可扩展性" title="可扩展性">可扩展性呢?为解决这一问题, 我们在此引入业务代理模式。
业务代理模式与业务接口模式完全不同。业务接口模式仅仅定义了业务逻辑接口,具体的实现用Session Bean完成,而业务代理并不是接口,它提供了对业务逻辑的访问,但不存在与其实现( Session EJB)组件的相关性。事实上,业务代理是一个helper类,用以与 EJB 容器交互、获取资源以及释放资源。
具体实现参见Pro_3。
pro_3. 用于 Student bean 的业务代理
package edu.biti.stu;
import java.rmi.RemoteException;
import javax.naming.NamingException;
public class StudentDelegate implements IStudent
{ private IStudent student;
public StudentDelegate()
{ init();
}
public void init()
{ try
{ // 查询并获取EJB
StudentHome StudentHome =
(StudentHome)EJBHomeFactory.getInstance().lookup(
"java:comp/env/ejb/StudentHome", StudentHome.class);
Student = StudentHome.create();
}
catch (Exception e)
{ e.printStackTrace();
}
public String getName() throws StudentException
{ try
{ return student.getName();
}
catch (RemoteException e)
{ e.printStackTrace();
}
}
public long getStuNo() throws StudentException
{ try
{ return Student.getStuNo();
}
catch (RemoteException e)
{ e.printStackTrace();
}
}
public boolean identify(long stuNo) throws StudentException
{ try
{ return student. identify (stuNo);
}
catch (RemoteException e)
{ e.printStackTrace();
}
}
//……..
}
在 StudentDelegate 类中,每个方法都可以响应传递给Session bean的请求。用init() 方法进行初始化资源。这样StudentDelegate就除去了应用程序 Web 层之间的相关性。在应用中我们只需如下调用即可:
IStudent stu = new StudentDelegate();
结束语
本文通过对j2ee设计模式的使用,实现了web与EJB的分离,可见,在web 层代码清晰、简洁,根本不涉及EJB层的代码,大大方便了以后程序的维护和修改工作。以后如果需要从使用 EJB 移植到使用纯 JDO,那么可进需要用新的 JDO类来重写业务代理就可以了。而 这一变化并不会影响Web 层,所以WEB层根本不需要重新编译和修改,大大降低了所编码的工作量。
参考文献:
1. Srikanth Shenoy 《Best practices in EJB exception handling》 developerWorks, 2002 .5
2. developerWorks Java
3. TheServerSide.com
4. sun.java.com J2ee design pattern
本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306116;邮箱:aet@chinaaet.com。
Baidu
map