I wish you

今天, 你java了吗

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  17 Posts :: 19 Stories :: 8 Comments :: 0 Trackbacks


    很不错的文章, 从网上摘来的.
   
    引子: 我自己弄了两个ejb, 相互之间有引用, 放到Jboss 4.0 里面去发布, 我只写好了 ejb-jar.xml, jboss.xml, 却没有指定web.xml, 结果在Jsp里面用一些测试代码查找ejb的时候, 告诉我 "ejb not bound", 估计很多人也遇到和我同样的错误:
    (xxxLocalHome) home = (xxxLocalHome)ic.lookup("java:comp/env/ejb/local/xxxLocalEJB");
但是当你使用
    (xxxLocalHome) home = (xxxLocalHome)ic.lookup("ejb/local/xxxLocalEJB");
却发现一切正常 ("ejb/local/xxxLocalEJB" 是在jboss.xml里面配置的xxxLocalEJB的JNDI名字), 看看下面的说明, 对号入座, 就知道为什么了


============================================================================================
    首先介绍JBoss容器中部署各类EJB对象的两种方法。下面的演示以Session Bean为例,客户端是一个本机上的web应用。这里不对演示程序进行具体介绍。
第一种方式:
    把开发好的ejb jar包和web应用的war包公共放在deploy目录下。
演示1:不需要jboss.xml文件和其他任何特殊的设置。
ejb-jar.xml:
    <ejb-jar>
    ······
        <ejb-name>ejbtest</ejb-name>
    ······
    </ejb-jar>
客户端:web应用中对web.xml不需要添加ejb信息,不需要jboss-web.xml文件。引用ejb对象的jsp文件如下:
    ······
    InitialContext ctx = new InitialContext();
    Object objref  = ctx.lookup("ejbtest");        //使用<ejb-name>                    beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);
    ······
    
演示2:使用jboss.xml文件。
    在缺省情况下JBoss的JNDI服务将通过ejb-jar.xml中<ejb-name>XXX</ejb-name>中的XXX来使用EJB的home interface。但是如果有多个ejb对象在相同的ejb jar包中,在ejb-jar.xml中通过<ejb-name>XXX</ejb-name>就可能不能很好的表示某一个ejb对象,所以一般我们希望可以提供一些附加的信息,例如采用这样的格式"[应用名]/[bean名]"来引用一个EJB对象。这时JNDI服务就可能不能正确地找到你的ejb对象,我们就需要使用jboss.xml文件,通过它实现jndi 名到ejb名的重定向。这个文件必须和ejb-jar.xml一起放到META-INFO目录下。
ejb-jar.xml:
<ejb-jar>
    ······
    <ejb-name>ejbtest</ejb-name>
    ······
</ejb-jar>
jboss.xml:
<jboss>
    <ejb-name>ejbtest</ejb-name>
    <jndi-name>example/ejbtest</jndi-name>
</jboss>
 
客户端:需要使用新的jndi名进行ejb定位。
······
    InitialContext ctx = new InitialContext();
    Object objref  = ctx.lookup("example/ejbtest");    //使用<jndi-name>                    beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);
······
第二种方式:
    把ejb和web应用包装成一个企业应用包。部署ear时可以简单地把通过application.xml描述ejb jar包和web应用的war包,同样在web.war中不需要提供特殊的信息就可以和第一种方式一样使用ejb对象。客户端代码也不需要进行改动。这里不再举例说明。
    此外我们可以进行更进一步的部署,这时需要使用到web.xml和jboss-web.xml。jboss-web.xml是JBoss提供的一个针对web应用进行配置的文件。jboss-web.xml和web.xml一起放在web应用的WEB-INF目录下。
演示1:改动web.xml文件,添加<ejb-ref>标记,不使用jboss-web.xml文件。
    (注意<ejb-ref>包括内部引用和外部引用。如果是同一个单元的可以通过<ejb-link>直接进行引用,而不用提供其他信息。)
web.xml:
······
<ejb-ref>
        <ejb-ref-name>ejb/ejbtest</ejb-ref-name>  <!--采用sun推荐的命名方式-->
        <ejb-ref-type>Session</ejb-ref-type>
        <home>org.zcx.test.zcxejb1Home</home>
        <remote>org.zcx.test.zcxejb1</remote>
        <ejb-link>ejbtest</ejb-link>    <!--必须和被应用的ejb-name匹配-->
</ejb-ref>
······
客户端:由于在web.xml中引入ejb引用描述这时ejb定位发生了变化:
······
    InitialContext ctx = new InitialContext();
    Object objref  = ctx.lookup("java:comp/env/ ejb/ejbtest ");    //使用java:comp/env命名空间    beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);
······
    
演示2:联合使用web.xml和jboss-web.xml
web.xml
······
<ejb-ref>
    <ejb-ref-name>ejb/ejbtest</ejb-ref-name>  <!--采用sun推荐的命名方式-->
        <ejb-ref-type>Session</ejb-ref-type>
        <home>org.zcx.test.zcxejb1Home</home>
        <remote>org.zcx.test.zcxejb1</remote>
</ejb-ref>
······
jboss-web.xml
<ejb-ref>
    <ejb-ref-name> ejb/ejbtest </ejb-ref-name>
    <jndi-name> example/ejbtest </jndi-name> <!-- 这里对应ejb对象的jndi名-->
</ejb-ref>
客户端:
    nitialContext ctx = new InitialContext();
    Object objref  = ctx.lookup("java:comp/env/ ejb/ejbtest ");                            beanHome=(zcxejb1Home)PortableRemoteObject.narrow(objref,ejbtestHome.class);
 
以上的所有演示说明了ejb-jar.xml、jboss.xml、web.xml、jboss-web.xml之间的基本关系和它们的使用方式。它们是部署各类ejb对象的关键文件。接下来介绍针对不同类型的ejb对象所需要的特殊配置。
posted on 2006-01-16 23:52 Iwishyou 阅读(447) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: