挠痒痒的专栏

彪悍的人生不需要解释

用户操作
[即时聊天] [发私信] [加为好友]
挠痒痒ID:chnic
1200次访问,排名2万外好友3人,关注者7
彪悍的人生不需要解释
chnic的文章
原创 8 篇
翻译 0 篇
转载 0 篇
评论 3 篇
挠痒痒的公告
写Blog主要为了沉淀一下自己的所学。这里的博文都是从我的另一博客copy来的。http://chnic.javaeye.com
最近评论
chnic:不好意思,源代码blog上面都有的。
你可以自己copy. 我基本上是在一份源代码上做的所有东西。
wsdd 还有一些相关文件早就改的面目全非了。
你照着我的步骤一步一步来 不会出错的。
singlesword2007:写的不错!深入而且易懂,期待下一篇!
allisgone:可以发一个完整的例子给我吗?发到邮箱里,谢了
文章分类
收藏
    相册
    存档
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 用JDK+记事本来完成一个无状态SessionBean收藏

    新一篇: 利用AXIS开发Webservice(四) —— 如何抛出自定义异常 | 旧一篇: 在Tomcat5.0.28 和5.5.15 配置JNDI数据源

            废话不多讲,先介绍下开发环境:JDK 1.4 + Weblogic 8.1 + j2ee.jar(这个jar包能在很多IDE的J2EE Library Container找到)。无状态SessionBean应该是Enterprise JavaBean里使用最普遍的一种bean,今天就从这种最普遍使用的bean开始。

            搭好环境是第一步在这里就一笔带过,之后把j2ee.jar这个文件随便找一个目录放下,在这里我放的是C:\lib目录。对EJB稍微熟悉点的人应该知 道无状态SessionBean应该实现一个Remote接口、一个Home接口和一个最终的实体类。前两个接口都是需要暴露给客户端进行调用的,真正具 体的逻辑是封装在实体类当中。我们就从这两个接口开始。

           我们先实现Romte接口,我们先建立一个工程目录在这里假设是TestEJB,再按照包层次结构把相应的目录建好,之后新建一个文本文件命名为Count.java ,在其中写入一个抽象方法。

    package com.chnic;  
      
    import javax.ejb.EJBObject;  
    import java.rmi.RemoteException;  
      
    public interface Count extends EJBObject {  
        
    public abstract int count(int a, int b) throws RemoteException;  
    }
      

     

           可以看到count(int a, int b)其实是个抽象方法,这个方法的具体实现在是在继承了SessionBean的那个实体类中。客户端通过接口调用容器中的具体实现,因为是远程的RMI 调用,所以可能会抛出RemoteException这个异常。完成了Romte接口之后来完成Home接口。新建文本文件并命名为 CountHome.java。
    package com.chnic;  
      
    import javax.ejb.EJBHome;  
    import javax.ejb.CreateException;  
    import java.rmi.RemoteException;  
      
    public interface CountHome extends EJBHome {  
        
    public abstract Count create() throws RemoteException, CreateException;  
    }
      

           在客户端中,客户通过JNDI得到的就是这个接口。然后通过Home接口的create()方法在容器里产生一个实例之后用户再通过刚刚实现的那个Remote接口来调用容器中的SessionBean。因为也是远程调用所以程序也可能会抛出RemoteException这个异常,如果创建不出实例则会抛出CreateException这个异常。两个客户端接口都实现了。接下来就是实现最重要的SessionBean这个实体类了,文类名为CountBean.java。

    package com.chnic;  
      
    import java.rmi.RemoteException;  
    import javax.ejb.EJBException;  
    import javax.ejb.SessionBean;  
    import javax.ejb.SessionContext;  
      
    public class CountBean implements SessionBean {  

        
    public void ejbCreate(){  
        }
      
          
        
    public void ejbActivate() throws EJBException, RemoteException {  
        }
      
      
        
    public void ejbPassivate() throws EJBException, RemoteException {  
        }
      
      
        
    public void ejbRemove() throws EJBException, RemoteException {  
        }
      
      
        
    public void setSessionContext(SessionContext arg0) throws EJBException,  
                RemoteException 
    {  
        }
      
          
        
    public int count(int a, int b){  
            
    return a+b;  
        }
      
    }
     

             这个
    CountBean 的实体类实现了SessionBean这个接口,ejbCreate()这个方法可以看成是这个SessionBean的构造函数,在这个SessionBean被产生实例的时候就会执行这个方法。而最后的count(int a, int b)这个方法就是Remote接口方法的具体实现了。下来我们来写配置文件在与com文件夹平级的目录建一个META-INF文件夹,新建文本文件保存为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>My Count Stateless SessionBean</display-name>  
                
    <ejb-name>mycount</ejb-name>  
      
                
    <home>com.chnic.CountHome</home>  
                
    <remote>com.chnic.Count</remote>  
                
    <ejb-class>com.chnic.CountBean</ejb-class>  
      
                
    <session-type>Stateless</session-type>  
                
    <transaction-type>Container</transaction-type>       
            
    </session>  
        
    </enterprise-beans>  
    </ejb-jar> 

            从节点的名字上不难发现一些配置的含义,这个ejb的名字是mycount。下面三个描述了Home、Remote、和实体Class的实现类。 session-type描述的是这个Bean是有状态Bean还是无状态SessionBean。至于两种Bean的区别在这里就不啰唆了,以后有空解 释吧。transaction-type则描述的是
    transaction的管理类型,有Container和Bean两种方式。搞定了ejb-jar.xml这个xml之后我们来写另外的一个xml命名为weblogic-ejb-jar.xml

    <?xml version="1.0" encoding="UTF-8"?>  
    <!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN'   
                'http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd'
    >  
    <weblogic-ejb-jar>  
        
    <weblogic-enterprise-bean>  
            
    <ejb-name>  
                mycount    
            
    </ejb-name>  
            
    <jndi-name>count</jndi-name>  
        
    </weblogic-enterprise-bean>  
    </weblogic-ejb-jar> 
         
            这个文件就不多解释,从节点名字上就能看的很清楚,一个是ejb的名字一个是jndi的路径。其实这里还有很多可选的配置选项,但因为这篇博文的重点的是如何实现一个EJB。所以这些深入的话题以后再介绍。
           OK,所有代码编写工作都已经完成,下面就是打包发布了。CMD打开控制台进入包含.java文件的那个目录,输入命令

     

    javac -extdirs c:lib *.java  

          c:\lib就是存放j2ee.jar这个文件的目录,因为我们刚刚编写的一些API是属于这个jar包的,所以要把这个jar包放在classpath 下。至于-extdirs的含义可以去看一下虚拟机类加载原理的相关信息。编译完成我们把.java文件剪切到别处因为接下来打jar包不需要这些文件。 cmd控制台进入工程目录(TestEJB)输入命令

     jar cvf Count.jar com/chnic META-INF/ *.class 

           这时在工程目录就会生成Count.jar这个文件。我们不用理会,接着在控制台输入命令

          
     java -Djava.ext.dirs=C:beaweblogic81serverlib;C:beajdk142_05lib weblogic.ejbc Count.jar

     

           因为我的weblogic安装在C盘根目录,具体路径根据实际情况而定。编译完之后就可以发现原来的Count,jar文件变胖了,用winrar打开之后发现增加了不少新的文件。做到这一步就可以说一个EJB已经被完成了,接下来就是发布。weblogic发布很简单进入后台页面upload这个jar文件接下来一路下一步就是。

           发布成功就开始测试我们这个bean,新建一个Test.java测试文件。


    package com.chnic;  
      
    import java.util.Hashtable;  
    import javax.naming.Context;  
    import javax.naming.InitialContext;  
    import javax.rmi.PortableRemoteObject;  
      
    public class Test {  
      
        
    public static void main(String[] args){  
            Hashtable ht 
    = new Hashtable();  
            ht.put(Context.INITIAL_CONTEXT_FACTORY, 
    "weblogic.jndi.WLInitialContextFactory");  
            ht.put(Context.PROVIDER_URL, 
    "t3://localhost:7001/");  
            
    try {  
                Context ctx 
    = new InitialContext(ht);  
                Object o 
    = ctx.lookup("count");  
                CountHome home 
    = (CountHome)PortableRemoteObject.narrow(o, CountHome.class);  
                Count ac 
    = home.create();  
                System.out.println(ac.count(
    22));  
                  
            }
    catch(Exception e) {  
                e.printStackTrace();  
            }
      
        }
      
    }
      

    编译之后,控制台进入相应目录输入执行命令

    java -Djava.ext.dirs=c:lib;C:beaweblogic81serverlib Test  

    执行之后发现控制台返回一个4,说明测试成功。就此我们完成了全部工作。

     

    发表于 @ 2008年03月14日 00:53:00|评论(loading...)|编辑

    新一篇: 利用AXIS开发Webservice(四) —— 如何抛出自定义异常 | 旧一篇: 在Tomcat5.0.28 和5.5.15 配置JNDI数据源

    评论:没有评论。

    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 挠痒痒