有关取EJB Home接口的疑问,望大侠们诠释一下,100分相送啊。

felic 2003-08-21 05:23:34
在sun的有关EJB的sample中取得EJBHome接口的时候都是使用如下方法:
InitialContext ic = new InitialContext();
Object objRef = ic.lookup("java:comp/env/ejb/TheConverter");
ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(objRef, ConverterHome.class);
但是在ejb-jar.xml中EJB的配置却是<ejb-name>ejb/TheConverter</ejb-name>.

而我用
InitialContext ic = new InitialContext();
Object objRef = ic.lookup("ejb/TheConverter");也能取得到Home接口,但是用上面的方法却取不到了。
请问:Context rootCtx = (Context) ic.lookup("java:comp/env");取得的是包含什么的Object?

分别用上面的2种方法来取Home接口的话,到底是在那儿设置呢?有什么具体的区别呢?期待大侠们的回答中啊,迫不及待的想把这100分送掉!
...全文
90 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinperwolf 2003-08-26
  • 打赏
  • 举报
回复
难道是weblogic的问题???
felic 2003-08-26
  • 打赏
  • 举报
回复
对于客户端不能调用的论点我不太同意:
不知道你有没有看过sun 的 j2eetutorial中的例子?
里面的所有例子都是通过lookup("java:comp/env/ejb/ejbname")来取得的。
在他给的例子中
EJB jar 文件中的ejb-jar:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>

<ejb-jar>
<display-name>ConverterJAR</display-name>
<enterprise-beans>
<session>
<display-name>ConverterBean</display-name>
<ejb-name>ConverterBean</ejb-name>
<home>ConverterHome</home>
<remote>Converter</remote>
<ejb-class>ConverterBean</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Bean</transaction-type>
<security-identity>
<description></description>
<use-caller-identity></use-caller-identity>
</security-identity>
</session>
</enterprise-beans>
</ejb-jar>

war文件中的web.xml:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>

<web-app>
<display-name>ConverterWAR</display-name>
<servlet>
<servlet-name>index</servlet-name>
<display-name>index</display-name>
<jsp-file>/index.jsp</jsp-file>
</servlet>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<ejb-ref>
<ejb-ref-name>ejb/TheConverter</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>ConverterHome</home>
<remote>Converter</remote>
</ejb-ref>
</web-app>

客户端jar文件的sun-j2ee-ri.xml:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE j2ee-ri-specific-information PUBLIC '-//Sun Microsystems Inc.//DTD J2EE Reference Implementation 1.3//EN' 'http://localhost:8000/sun-j2ee-ri_1_3.dtd'>

<j2ee-ri-specific-information>
<app-client>
<ejb-ref>
<ejb-ref-name>ejb/SimpleConverter</ejb-ref-name>
<jndi-name>MyConverter</jndi-name>
</ejb-ref>
</app-client>
</j2ee-ri-specific-information>

客户端jar文件的application-client.xml:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE application-client PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.3//EN' 'http://java.sun.com/dtd/application-client_1_3.dtd'>

<application-client>
<display-name>ConverterClient</display-name>
<ejb-ref>
<ejb-ref-name>ejb/SimpleConverter</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>ConverterHome</home>
<remote>Converter</remote>
</ejb-ref>
</application-client>



而在客户端掉用的方法分别为:
jsp中的调用方法:
InitialContext ic = new InitialContext();
Object objRef = ic.lookup("java:comp/env/ejb/TheConverter");
ConverterHome home = (ConverterHome)PortableRemoteObject.narrow(objRef, ConverterHome.class);
converter = home.create();

java class client 端中调用方法:
Context initial = new InitialContext();
Context myEnv = (Context)initial.lookup("java:comp/env");
Object objref = myEnv .lookup("ejb/SimpleConverter");


以上是在sun自带的服务器中运行的。


而我自己在weblogic中设置为楼上的楼上的楼上所示.
只能用lookup("ejb/SimpleConverter");不能lookup("java:comp/env/ejb/TheConverter");



!!!!共同进步!!!!
webswim 2003-08-26
  • 打赏
  • 举报
回复
关于上面的.xml文件:

1。 ejb-jar.xml:
。。。。。
<ejb-ref>
<description>ejb/HelloBean</description>
<ejb-ref-name>ejb/HelloBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>mastingejb.HelloHome</home>
<remote>mastingejb.Hello</remote>
</ejb-ref>
。。。。。
这一段是什么意思? 是表示HelloBean又调用了另一个EJB——ejb/HelloBean吗?
如果不是的话,这段应该是多余的。
同理,weblogic-ejb-jar.xml中的”<ejb-ref-name>ejb/HelloBean</ejb-ref-name>“可能也是多余的(我没用过weblogic, 说说而已)


2。web.xml是空的,web端如果有使用EJB的话,应该有应用说明:
<ejb-ref>
<ejb-ref-name>ejb/HelloBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>mastingejb.HelloHome</home>
<remote>mastingejb.Hello</remote>
</ejb-ref>
这里的<ejb-ref-name>ejb/HelloBean</ejb-ref-name>应为JNDI名称(web-app_2_3.dtd文件中的有关描述似乎与实际使用不符?请高手指点!!!)。
sinperwolf 2003-08-26
  • 打赏
  • 举报
回复
可能就是这样:只能在EJB内部使用!

客户端不能调用lookup("java:comp/env/ejb/ejbname")
webswim 2003-08-26
  • 打赏
  • 举报
回复
昨天又试了一试,明白了一个道理:

java:comp/env/代表EJB的环境,相当于旧的getEnvironment()。所以lookup("java:comp/env...")只能在EJB内部使用,即可以从一个EJB中查找另一个EJB,在C/S客户端和Web页面都不能使用。
客户端只能使用JNDI名称,我还测了一个数据源的使用,“java:/MSSQLDS"在EJB中可以使用,但在Client程序中不能。



这样说来,关于可移植性的描述应该就不正确了:
--》 用("java:comp/env/ejb-name")可以提高代码的移植性,可以消除对某个特定naming系统和jvm的依赖 --《

我觉得应该是使用JNDI名称更具可移植性:
. 在java:comp/env/ejb-name中用的是EJB的名称,一般不会随发布改变;
. ejb/ejb-ref用的是JNDI名称,发布是可以修改web.xml等文件改变,这样的好处是: 可以避免在引用名使用上的不方便,实际使用的客户可以按其意愿重新配置改名称。


大家以为呢?


sinperwolf 2003-08-26
  • 打赏
  • 举报
回复
同上!
goodchen8 2003-08-25
  • 打赏
  • 举报
回复
免费电影高速下载
http://free.dlmovie.net/movie/freemovie.asp?userid=zscsichen
felic 2003-08-25
  • 打赏
  • 举报
回复
非常感谢大家的帮助,我总结了一下大家的发言如下:
EJB可以用2种方法来取得
1.Context rootCtx = (Context) ic.lookup("java:comp/env/ejb-ref");
2.Object objRef = ic.lookup("jndi-name");
如果用第一种的话,ejb-jar.xml中设置<ejb-ref></ejb-ref>属性.....,用这种方法可以提高代码的移植性,可以消除对某个特定naming系统和jvm的依赖(就是说不管是使用websphere还是weblogic作应用服务器,还是所引用的ejb是否在一个jvm里);
如果没有设置<ejb-ref></ejb-ref>那么就需要设置<jndi-name></jndi-name>,就是用第二种方法来取得。(用这种方法不易于移植)。
我也觉得caishixia的正确说的是正确的,我正在调试中:)
webswim 2003-08-25
  • 打赏
  • 举报
回复
关于“java:comp/env”的描述还是caishixia的正确。


felic (fenglc) :
你的问题可能与具体的应用服务器有关,你在发布到什么服务器下? 能否把你的ejb-jar.xml和 另一个与服务器有关的xml(如JBoss的jboss.xml) 写出来看看?
sinperwolf 2003-08-25
  • 打赏
  • 举报
回复
我的情况和搂主的完全一样
Caught an Exception: Unable to resolve 'java:comp.env/ejb/SavingsAccountHome' Resolved: '' Unresolved:'java:comp'
felic 2003-08-25
  • 打赏
  • 举报
回复
web.xml:
<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
</web-app>

ejb-jar.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<enterprise-beans>
<session>
<display-name>HelloBean</display-name>
<ejb-name>HelloBean</ejb-name>
<home>mastingejb.HelloHome</home>
<remote>mastingejb.Hello</remote>
<ejb-class>mastingejb.HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
<ejb-ref>
<description>ejb/HelloBean</description>
<ejb-ref-name>ejb/HelloBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>mastingejb.HelloHome</home>
<remote>mastingejb.Hello</remote>
</ejb-ref>
</session>
</enterprise-beans>
<assembly-descriptor/>
</ejb-jar>

weblogic-ejb-jar.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 7.0.0 EJB//EN' 'http://www.bea.com/servers/wls700/dtd/weblogic-ejb-jar.dtd'>
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
<ejb-name>HelloBean</ejb-name>
<reference-descriptor>
<ejb-reference-description>
<ejb-ref-name>ejb/HelloBean</ejb-ref-name>
<jndi-name>ejb/HelloBean</jndi-name>
</ejb-reference-description>
</reference-descriptor>
<jndi-name>HelloBean</jndi-name>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>

在这种情况下还是只能用lookup("HelloBean");
还是不能使用lookup("java:comp/env/ejb/HelloBean");
liuha511 2003-08-24
  • 打赏
  • 举报
回复
Context rootCtx = (Context) ic.lookup("java:comp/env/ejb-ref");

Object objRef = ic.lookup("jndi-name");
效果是一样!
察看一下你的ejb-jar中的配置,偶觉得你的jndi名应该是'ejb/TheConverter',所以你直接取jndi就取到了正确的对象。
但是当你用deploy的jsp或者servlet访问容器中的ejb的时候,通常RI的deploytool会让你为其指定ejb-ref,你可以察看war里的配置文件,找到这个字串,这时候你就可以用上面的方法取得相应的对象了。
shangqiao 2003-08-23
  • 打赏
  • 举报
回复
java:comp/env/是在ejb-jar里面配制的,用于EJB的引用,而另一种是与你使用的服务器有关,在与次相对应的服务器文件里面配制(更推荐使用第一中,这样可以增加应用服务器平台的移植性
liuyi8903 2003-08-23
  • 打赏
  • 举报
回复
等待当中
caishixia 2003-08-22
  • 打赏
  • 举报
回复
在ejb规范中,所有的资源都放在JNDI Naming系统的java:comp/env入口(entry)下,然后推荐(是推荐不是强制)把所有的ejb放在java:comp/env/ejb/,其他相应的资源,如:jms就放在java:comp/env/jms/,然后在ejb-jar.xml中通过<ejb-ref>标签,就可以消除对某个特定naming系统和jvm的依赖(就是说不管是使用websphere还是weblogic作应用服务器,还是所引用的ejb是否在一个jvm里),我们都可以通过
Object objRef = ic.lookup("java:comp/env/ejb/ejbName");
来调用业务逻辑,当然在特定的应用服务器上还需要做一些名字的映射(假设在weblogic上)
如果
Object objRef = ic.lookup("ejb/ejbName");
那么就跟具体的应用服务器就紧密耦合在一块了,如果什么时候想把整个程序移植到另外一个应用
服务器上,那么整个lookup的名字就要修改。但是采用第一种方式,只需要修改相应应用服务器的
相关部署文件就可以了。不过第一种方式有个弱点就是当引用的ejb多了,比如说10个ejb相互引用
那么部署文件就会非常大,这是一个m*n的数量级


在ejb-jar.xml中
<ejb-ref>
<ejb-ref-name>ejb/TheConverter</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>..</home>
<remote>..</remote>
</ejb-ref>

然后在weblogic-ejb-jar.xml中
<ejb-reference-description>
<ejb-ref-name>ejb/TheConverter</ejb-ref-name>
<jndi-name>ejb/TheConverter</jndi-name>
</ejb-reference-description>

那么我们在程序中,
Object objRef = ic.lookup("java:comp/env/ejb/ejbName");
Object objRef = ic.lookup("ejb/ejbName");
结果一样的


felic 2003-08-22
  • 打赏
  • 举报
回复
我在weblogic的环境中只有web的测试端,我看过weblogic自带的sample中,在java类的测试端也是通过lookup简名就行了。
在sun自带的j2ee的环境中两个都有。我在j2ee服务器中的测试端和ejb都是在一个ear文件中,按理说 应该是ejb和测试端都在一个application中了,但是 在j2ee服务器的环境时,用简名的时候 是不能得到Home接口的 :(
fxfboy 2003-08-22
  • 打赏
  • 举报
回复
java:comp/env 是sun的j2ee容器提供的jndi服务的服务名,你写的程序的jndi名都发布在这颗jndi树上。java:comp/env就是根节点,如果你的测试程序也在你的容器中那么就可以直接的lookup(ejb/TheConverter),比如你的ejb和你的webapp放在一个application中那么就可以直接的lookup(ejb/TheConverter),如果你的测试程序,是独立启动的话就要lookup全名了!不知道你的例子是不是有java类的测试端,也有web的测试端。java类的要写全名,web的就不用了写简名就行了!
felic 2003-08-22
  • 打赏
  • 举报
回复
up
felic 2003-08-22
  • 打赏
  • 举报
回复
那weblogic对这个的约定是什么?请赐教
felic 2003-08-22
  • 打赏
  • 举报
回复
up
加载更多回复(18)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧