分享
 
 
 

JBuilder9+Weblogic7实战篇Entity Bean运用(四)

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

JBuilder9+Weblogic7实战篇

ENTITY BEAN的运用(四)

作者:黄 凯

E_mail:hk_sz@163.com

七、通过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引用的名字是不变的,但是它所引用的内容是可变的,参见以下代码:

<weblogic-enterprise-bean>

<ejb-name>facade</ejb-name>

<reference-descriptor>

<ejb-reference-descriptor>

<ejb-ref-name>student</ejb-ref-name>

<jndi-name>Student</jndi-name>

</ejb-reference-descriptor>

</reference-descriptor>

<jndi-name>facade</jndi-name>

</weblogic-enterprise-bean>

建立了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),欢迎转载,不过,请保留作者以及修订者的名字,谢谢。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有