jndi 绑定和源代码分析
ejb 模块
从 dualejbmodule01 开始。在 ejb deployment descriptor 编辑器面板中,选择 beans 选项卡,然后选择 dualentity,并且确保 websphere bindings 部分中的 jndi 名设置为 “ejb/dual/ejb/dualentityhome” 。保存所有的更改。首先,让我们研究 dualejbmodule02 项目中 dualsession ejb 的 ejb-jar.xml 的代码片断:
...
...
这里,第一个元素(具有名称“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 的初始参数:
...
-->
...
上面的代码在意义上类似于前面讨论的 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 通信的引用:
...
...
相对地,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 必须有指向所有模
闽公网安备 35060202000074号