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

当前页面: 开发资料首页Java 专题JBuilder9+Weblogic7实战篇-ENTITY BEAN的运用(四)

JBuilder9+Weblogic7实战篇-ENTITY BEAN的运用(四)

摘要: JBuilder9+Weblogic7实战篇-ENTITY BEAN的运用(四)

七、通过Session Bean访问Entity Bean
在前面给出的Entity Bean实例都是通过java客户端程序直接访问Entity Bean
(通过Entity Bean的远程接口),在实际的应用系统开发中通常不采用这种做法,
经常采用的是这样一种做法:建立一个Session Bean,该Session Bean中封装对
Entity Bean的访问。而且访问时通过Entity Bean的本地接口进行以提高性能,客
户端不与Entity Bean直接打交道,客户端通过Session Bean完成对Entity Bean的
操作。这中做法其实是遵循了一种设计模式:Facade设计模式。
7.1 EJB引用
在一个EJB中访问其他EJB,例如Session Bean facade要访问Entity Bean
student,可以直接在facade中用“硬编码”实现,即在facade中通过Student的
JNDI名字找到Home对象,然后获得对外接口(Remote接口或Local接口),完成方法
调用。这种方式的缺点是显而易见的,因为这两个EJB被紧紧绑在一起,例如
student有什么改动,例如改名字,那么facade就必须改代码(这也是为什么在
《Entity Bean的运用(二)》中需要重新建立一个TestClient的原因)。
J2EE采用这样一种方式解决此问题:在facade的部署描述文件中定义一个EJB引
用,该项描述了对另一个EJB的引用,在facade的代码中只使用EJB引用的名字,EJB
引用的名字是不变的,但是它所引用的内容是可变的,参见以下代码:

facade


student
Student


facade

建立了EJB引用后,facade可以通过此引用获得要访问的EJB student的接口,参见以下代码:
Context context = new InitialContext();
Object ref = context.lookup("java:/comp/env/student");
studentHome = (StudentHome)ref;
在使用EJB引用时,作为lookup方法参数的完整的JNDI名字是
“java:/comp/env/”+ EJB引用名,例如名为student的EJB引用,对应完整的JNDI
名字是“java:/comp/env/student”。
7.2 EJB引用实例
7.2.1打开《Entity Bean的运用(一)》中建立的comSample工程,新建一个名为
facade的Session Bean(可参看《SESSION BEAN篇》)。修改该Bean的如下信息:
★ Bean name: facade
★ Interface: remote
★ Session type: Stateless
7.2.2 在文档窗口“EJB Designer”中用鼠标右键单击facade,选择Open DD
Editor菜单项。
7.2.3 在“DD Editor”界面中单击下方的EJB Local References选项卡。
7.2.4 在“EJB Local References”的设置界面中,单击Add按钮,然后在Name项后
输入EJB引用的名字student,选中IsLink复选框(如果要引用的EJB是位于同一
Jbuilder工程中则选种此项),Link项选择Student(要引用的EJB),其他项采用
系统自动的设置即可。
7.2.5 在facade中增加一个方法getStuInfo(),该方法的功能是找到与参数(代表
stuid)对应的Entity Bean Student,然后调用Student的方法getStuid()和
getStuname()。该方法的属性如下:
★ Method name: getStuInfo
★ Return type: String
★ Input parameters: String stuid
★ Interface: remote
7.2.6 在facade的Bean类中加入访问Student的代码。要访问Student,首先要获得
Student的Home对象,这可以通过EJB引用获得。获得Home对象这部分代码要放在
facade的ejbCreate()方法和ejbActivate()方法中(即只要facade的实例一被建立
或激活,就会获得Student的Home对象)。获得Student的Home对象后,在
getStuInfo()方法中通过Home对象得到Student的本地接口(Local Interface),
然后通过本地接口调用Student的方法。用以下代码替换facadeBean.java的代码:
(灰色代码部分为手工添加的)
package cmpsample;
import java.math.*;
import javax.ejb.*;
import javax.naming.*;
public class facadeBean
implements SessionBean {
SessionContext sessionContext;
public Student student = null;
private StudentHome studentHome = null;
public void ejbCreate() throws CreateException { try {
Context context = new InitialContext();
Object ref = context.lookup("java:/comp/env/student");
studentHome = (StudentHome) ref; }
catch (Exception e) {
e.printStackTrace(); } }
public void ejbRemove() {
/**@todo Complete this method*/ }
public void ejbActivate() { try {
Context context = new InitialContext();
Object ref = context.lookup("java:/comp/env/student");
studentHome = (StudentHome) ref; }
catch (Exception e) {
e.printStackTrace(); } }
public void ejbPassivate() {
/**@todo Complete this method*/ }
public void setSessionContext(SessionContext sessionContext) {
this.sessionContext = sessionContext; }
public String getStuInfo(String stuid) {
String strStu = null; try {
student = studentHome.findByPrimaryKey(new BigDecimal(stuid));
strStu = "The studentID is " + student.getStuid() + " Name is " +
student.getStuname(); }
catch (Exception e) {}
return strStu; } }
7.2.7 重新编译EJB module,生成Cmp.jar文件,并部署到Weblogic Server上。
7.2.8 新建facade的客户端程序facadeTestClient1.java,利用该客户端程序访问
facade的getStuInfo()方法。修改该客户端程序的main()方法如下:
public static void main(String[] args) {
facadeTestClient1 client = new facadeTestClient1();
client.create();
client.getStuInfo("2"); }
7.2.9 编译运行该客户端程序,验证结果。
参考
电子工业出版社 《J2EE应用开发(Jbuilder+Weblogic)》
我的文章首发牛耳论坛(www.newer.com.cn/bbs)和程序员论坛(www.csdn.net)
,欢迎转载,不过,请保留作者以及修订者的名字,谢谢。
↑返回目录
前一篇: JBuilder开发实践者之路--使用JBuilder编辑器
后一篇: JBuilder9+Weblogic7实战篇-ENTITY BEAN的运用(三)