分享
 
 
 

灵活使用EJB的本地和远程接口(三)

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

JNDI 绑定和源代码分析

EJB 模块

从 DualEJBModule01 开始。在 EJB Deployment Descriptor 编辑器面板中,选择 Beans 选项卡,然后选择 DualEntity,并且确保 WebSphere Bindings 部分中的 JNDI 名设置为 “ejb/dual/ejb/DualEntityHome” 。保存所有的更改。首先,让我们研究 DualEJBModule02 项目中 DualSession EJB 的 ejb-jar.xml 的代码片断:

...

useLocal

java.lang.Boolean

true

doTrace

java.lang.Boolean

false

ejb/DualEntityRemoteHome

Entity

dual.ejb.DualEntityRemoteHome

dual.ejb.DualEntityRemote

DualEJBModule01.jar#DualEntity

ejb/DualEntityLocalHome

Entity

dual.ejb.DualEntityLocalHome

dual.ejb.DualEntityLocal

DualEJBModule01.jar#DualEntity

...

这里,第一个元素(具有名称“useLocal”)是用来控制 DualEntity EJB 的本地接口的使用的。第二个条目(具有名称“doTrace”)准备只用于跟踪。已实现的跟踪功能是相当基本的,但是对于我们的目的来说足够了。 相应的 Java 代码看起来像是下面这样的:

public class DualSessionBean implements javax.ejb.SessionBean {

private javax.ejb.SessionContext mySessionCtx;

private boolean doTrace;

private boolean useLocal;

private DualEntityRemoteHome entityRemoteHome;

private DualEntityLocalHome entityLocalHome;

public void setSessionContext(javax.ejb.SessionContext ctx) {

mySessionCtx = ctx;

try {

Context initCtx = new InitialContext();

Boolean option = null;

option = (Boolean)initCtx.lookup("java:comp/env/useLocal");

useLocal = option.booleanValue();

option = (Boolean)initCtx.lookup("java:comp/env/doTrace");

doTrace = option.booleanValue();

if (doTrace)

System.out.println("DualSessionBean#setSessionContext: useLocal="

+useLocal);

Object homeObject = null;

if (useLocal){

homeObject = initCtx.lookup("java:comp/env/ejb/DualEntityLocalHome");

entityLocalHome = (DualEntityLocalHome)homeObject;

} else {

homeObject = initCtx.lookup("java:comp/env/ejb/DualEntityRemoteHome");

entityRemoteHome = (DualEntityRemoteHome)

javax.rmi.PortableRemoteObject.narrow(homeObject,

DualEntityRemoteHome.class);

}

} catch(NamingException ne){

// process exception here...

}

}

...

在 Java 代码中,EJB 环境变量是作为无状态会话 Bean 对象的生命周期的类变量存储的。DualEntity 的本地接口和 Remote Home Interface 是通过引用访问的;这是首选的方式,并且遵守 EJB 2.0 规范。相对地,ejb-jar.xml 包含描述这些引用的 ejb-ref 和 ejb-local-ref 元素。打开 EJB Deployment Descriptor 编辑器,然后选择 Beans 选项卡。确保 JNDI 名设置为“ejb/dual/ejb/DualSessionHome”。然后转到 References 选项卡,确保对 DualEntity 两个引用指向 JNDI 名“ejb/dual/ejb/DualEntityHome”。必要时可以更改这些值,然后保存所作的更改。

Web 模块

DualWebModule03project 标准的 J2EE Web 部署描述符包含两个重要的代码片段。第一个指定该 Servlet 的初始参数:

...

useLocal

true

doTrace

true

jndiProviderURL

iiop://localhost:2809

jndiNameOnServer

ejb/dual/ejb/DualSessionHome

initialCtxFactoryClassName

com.ibm.ejs.ns.jndi.CNInitialContextFactory

--

...

上面的代码在意义上类似于前面讨论的 EJB 环境参数。注释掉的 Web 部署描述符部分后面将需要用于分离容器(Separate Containers)拓扑。The Web deployment descriptor section that is commented out will be needed later for the Separate Containers topology. 如果这三个附加的参数没有注释掉,在与此体系结构有关的逻辑将通过该 Servlet 的 init() 方法进行调用。(稍后将对此进行更多的介绍。)第二个代码片段描述了需要用来建立 Servlet 与 EJB 通信的引用:

...

ejb/DualSessionRemoteHome

Session

dual.ejb.DualSessionRemoteHome

dual.ejb.DualSessionRemote

DualEJBModule02.jar#DualSession

ejb/DualSessionLocalHome

Session

dual.ejb.DualSessionLocalHome

dual.ejb.DualSessionLocal

DualEJBModule02.jar#DualSession

...

相对地,DualServlet 的源代码包含该 Servlet 的 init() 方法中的处理逻辑。下面是与处理 EJB 引用有关的代码片段:

...

final String JNDI_NAME_LOCAL = "java:comp/env/ejb/DualSessionLocalHome";

final String JNDI_NAME_REMOTE = "java:comp/env/ejb/DualSessionRemoteHome";

...

if (useLocal) {

initCtx = new InitialContext();

homeObject = initCtx.lookup(JNDI_NAME_LOCAL);

sessionLocalHome = (DualSessionLocalHome) homeObject;

} else {

homeObject = initCtx.lookup(JNDI_NAME_REMOTE);

sessionRemoteHome =

(DualSessionRemoteHome) PortableRemoteObject.narrow(

homeObject,

DualSessionRemoteHome.class);

}

...

(下载的源代码中的初始参数处理逻辑实际上更复杂,因为它还处理分离容器(Separate Containers)拓扑。)可以在 DualWebModule03 的 Web Deployment Descriptor 编辑器窗格中,首选选中 DualServlet 的所有设置(包括 Initialization 部分在内),然后转到 References 选项卡,选中 EJB 和 EJB Local 这两个子选项卡。两个引用应该指向 WebSphere Bindings 部分中的JNDI 名“ejb/dual/ejb/DualSessionHome”。

项目依赖性总结

现在我们基本上完成了这些模块,让我们再次回顾一下所有项目(包括 EAR 在内)的依赖性:

?DualJavaModule00 没有依赖性。

?DualEJBModule01 没有依赖性。

?DualEJBModule02 在“Java Build Path”、“Java JAR Dependencies”和“Project References”?设置中必须有 DualJavaModule00、DualEJBModule01 项目。

?DualWebModule03 在“Java Build Path”、“Project References”和“Web Library Projects”设置中必须有 DualJavaModule00、DualEJBModule02 项目。

?DualEARForEJBContainer 在“Project References”设置中必须有 DualJavaModule00、DualEJBModule01、DualEJBModule02;EAR 部署描述符必须有指向 EJB 模块和 Java 模块的引用。

?DualEARForAllInOne 必须有指向所有模

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有