jboss ejb 简单实例

jboss作为一个免费的ejb容器深受大家的喜爱,下面提供一个简单的cmp + session小例子供大家参考.
 该bean为一个cmp实体bean 和一个session Bean 实体bean 为一个userBean 提供一个用户的基本信息
 该用户有两个字段email和password,其中email是主键,为了防止客户端直接访问实体Bean,该实体bean
 不提供远程接口,而是通过一个sessionBean来操作实体Bean,客户机通过和sessionBean的交互达到
 操作实体Bean的目的

 环境:jboss3.23 + winxp/2000
 数据库:mysql for win alpha 4.0
 jdbc驱动:mysql alpha3.1
 以上东东都很好找到,不在赘述
 
 一:jboss的配置
     工欲善其事必先利其器,首先要把我们的主角调教好:
     把下载的jboss3.23 解压到一个目录,为了省事,我放到c:/jboss目录下
     设置好JAVA_HOME变量后,设置JBOSS主目录:c:/jboss
     设置好这些变量后,运行$jboss_home/bin/run.bat    
     出现以下字符界面,说明配置成功
     
      13:13:56,816 INFO  [Server] JBoss (MX MicroKernel) [3.2.3 (build: CVSTag=JBoss_3
       _2_3 date=200311301445)] Started in 36s:993ms
  二:配置数据源
      1.首先拷贝mysql的jdbc驱动到$jboss_home/server/default/lib 目录下
      然后拷贝文件C:/jboss/docs/examples/jca/mysql-ds.xml 到  $jboss_home/server/default/deploy
      目录下,
     
      2.用文本编辑工具打开mysql-ds.xml 文件,编辑其中内容:
         样本如下:
         <datasources>
          <local-tx-datasource>
          <jndi-name>MySqlDS</jndi-name>
          <connection-url>jdbc:mysql://dell:3306/jbossdb</connection-url>
          <driver-class>org.gjt.mm.mysql.Driver</driver-class>
          <user-name>x</user-name>
          <password>y</password>
           </local-tx-datasource>
         </datasources>
      请根据数据库具体设置,填写用户名和密码,其他不要动
      3.修改$jboss_home/server/default/conf/standardjbosscmp-jdbc.xml  
       文件:
        样本如下:
        <defaults>
         <datasource>java:/MySqlDS</datasource>
         <datasource-mapping>mySQL</datasource-mapping>    
        其余部分不要改动
     
      配置完成后,基本环境就ok了,下面开始bean的开发
   三: 开发实体bean
     
      1. 本地Home接口提供了创建bean的方法,该home接口提供一个create方法,和一个findByPrimaryKey方法
       详细清单如下:
       package test;
       import javax.ejb.EJBLocalHome;
       import javax.ejb.CreateException;
       import javax.ejb.FinderException;

       public interface LocalUserHome extends EJBLocalHome
       {
 
public LocalUser create(String email,String password)
      throws CreateException;
public LocalUser findByPrimaryKey(String email)
      throws FinderException;
       }
      2.local接口提供业务方法
        详细清单如下:
       package test;
import javax.ejb.EJBLocalObject;

public interface LocalUser extends EJBLocalObject{

public String getEmail();
 
 public String getPassword();

}
      应为置email和password为只读,所以没有提供setter方法,不过在具体Bean里需要实现setter方法
      3.实体Bean类
       实现业务方法及回调方法,
        详细清单如下:
       
        package test;
 import javax.ejb.EntityBean;
import javax.ejb.CreateException;
import javax.ejb.EntityContext;
public abstract class UserBean implements EntityBean{

  public String ejbCreate(String email,String password)
  throws CreateException
  {
    this.setEmail(email);
    this.setPassword(password);  
    return null;
  }
  //abstract method
 
  public  abstract void setEmail(String email);
  public  abstract String getEmail();
  public  abstract void setPassword(String password);
  public abstract String getPassword();
 
  public void ejbPostCreate(String email,String password){}
 
  public void ejbActivate(){}
 
  public void ejbPasstivate(){}
 
  public void ejbLoad(){}
 
  public void ejbStore(){}
 
  public void setEntityContext(EntityContext ctx){}
 
  public void unsetEntityContext(){}
 
  public void ejbRemove(){}

}
         
   4.实体Bean的ejb-jar.xml配置文件清单:
          <entity>
     <display-name>UserBean</display-name>
     <ejb-name>UserBean</ejb-name>

     <local-home>test.LocalUserHome</local-home>
     <local>test.LocalUser</local>
     <ejb-class>test.UserBean</ejb-class>

     <persistence-type>Container</persistence-type>
     <prim-key-class>java.lang.String</prim-key-class>

     <reentrant>True</reentrant>
     <cmp-version>2.x</cmp-version>

     <abstract-schema-name>UserBean</abstract-schema-name>

     <cmp-field>
       <description>no description</description>
       <field-name>password</field-name>
     </cmp-field>
     <cmp-field>
       <description>no description</description>
       <field-name>email</field-name>
     </cmp-field>

     <primkey-field>email</primkey-field>

     <security-identity>
       <description></description>
       <use-caller-identity></use-caller-identity>
     </security-identity>
   </entity>
   
 四: 开发sessionbean
   1.sessionbean 的home接口,因为需要和客户交互,所以sessionbean必须提供远程接口
     清单如下:
     package test;

import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface UserManagementHome extends EJBHome
{

  public UserManagement create() throws CreateException,RemoteException;
}

     注意该接口需要抛出RemoteException而本地接口则不需要
   2.sessionbean远程接口,该接口提供session需要实现的逻辑方法
    清单如下:
   
     package test;

import javax.ejb.EJBObject;
import java.rmi.RemoteException;

public interface UserManagement extends EJBObject
{
  public void addUser(String email,String password) throws RemoteException;
 
  public void removeUser(String email) throws RemoteException;
 
  public boolean verifyPassword(String email,String password) throws RemoteException;


}
  3 sessionbean的实现类
     详细清单如下:
     package test;

import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.CreateException;
import javax.ejb.RemoveException;
import javax.ejb.FinderException;

import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.InitialContext;
import test.LocalUser;
import test.LocalUserHome;


public class UserManagementBean implements SessionBean{

private LocalUserHome userHome=null;

//助手方法用来查找实体bean的home接口

private LocalUserHome getUserHome()
 throws NamingException
{
 
   Context initial=new InitialContext();
   return (LocalUserHome)initial.lookup("java:comp/env/ejb/LocalUser");


}

public void addUser(String email,String password)
{
  try{
 
   LocalUser user=userHome.create(email,password);
 
  }catch(CreateException e)
  {
 
   System.out.print(e.toString());
  }

}

public void removeUser(String email)
{

 try{
 
   userHome.remove(email);
   
  }catch(RemoveException e)
  {
 
   System.out.println(e.toString());
  }

}

public boolean  verifyPassword(String email,String password)
{
   boolean verify=false;
 try{
 
   LocalUser user=userHome.findByPrimaryKey(email);
   verify=user.getPassword().equals(password);
 
 }catch(FinderException e)
 {
 
   System.out.println(e.toString());
 }
 return verify;
}

public void ejbCreate() throws CreateException
{

 try{
 
   userHome=this.getUserHome();
 }catch(NamingException e)
 {
 
   System.out.println(e.toString());
 }

}


public void ejbActivate(){}
{
  try {
           userHome = getUserHome();
       } catch (NamingException e) {
           
               System.out.print("Unable to find local user home in Activate");
       }


}


public void ejbRemove(){}

public void ejbPassivate(){
 userHome=null;

}

public void setSessionContext(SessionContext ctx){}

   }
     
     
   4:sessionbean的配置描述文件:
   
     <session>
     <display-name>UserManagementBean</display-name>
     <ejb-name>UserManagementBean</ejb-name>

     <home>test.UserManagementHome</home>
     <remote>test.UserManagement</remote>
     <ejb-class>test.UserManagementBean</ejb-class>

     <session-type>Stateful</session-type>
     <transaction-type>Container</transaction-type>

     <ejb-local-ref>
       <ejb-ref-name>ejb/LocalUser</ejb-ref-name>
       <ejb-ref-type>Entity</ejb-ref-type>
       <local-home>test.LocalUserHome</local-home>
       <local>test.LocalUser</local>
       <ejb-link>UserBean</ejb-link>
     </ejb-local-ref>

     <security-identity>
       <description></description>
       <use-caller-identity></use-caller-identity>
     </security-identity>
   </session>
   
   
   五:客户端Client
     package test;

import test.UserManagementHome;
import test.UserManagement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

public class Client{

 public static void main(String[] args)
 {
 
   try{
       Context ctx=new InitialContext();
       Object ref=ctx.lookup("UserManagementHome");
       UserManagementHome home=(UserManagementHome)PortableRemoteObject.narrow(ref,UserManagementHome.class);
       UserManagement user=home.create();
       user.addUser("wuchensir@yahoo.com.cn","lms");
       user.addUser("wuchensir@sohu.com","sohu");
       
       user.addUser("wuchensir@163.com","163");
       user.removeUser("wuchensir@163.com");
   
       boolean login=user.verifyPassword("wuchensir@sohu.com","sohu");
       System.out.println(login);
    }catch(Exception e)
    {
   
     System.out.print(e.toString());
    }
 
 
 
 }

}

六:jboss的配置文件jboss.xml
 清单如下:
  <?xml version="1.0"?>

<jboss>
    <enterprise-beans>
      <entity>
<ejb-name>UserBean</ejb-name>
<jndi-name>LocalUser</jndi-name>
      </entity>
      <session>
<ejb-name>UserManagementBean</ejb-name>
<jndi-name>UserManagementHome</jndi-name>
<ejb-local-ref>
  <ejb-ref-name>ejb/LocalUser</ejb-ref-name>
  <jndi-name>LocalUser</jndi-name>
</ejb-local-ref>
      </session>
    </enterprise-beans>
</jboss>
该清单提供了实体bean和sessionbean的jndi设置,一个sessionbean对实体bean的引用描述

七打包:
  可以用ant工具打包,也可以用jar打包
    目录结构
      --
        --test
        --META-INF
     假设类文件放在f:/java目录下,
     执行命令:
       c:/
        cd f:/java
        jar cvf user.jar *
       
     完成
八,部署
   jboss支持热部署 ,把jar包放到deploy目录下即可实现自动部署,数据库也会自动创建
    ,也可以手工创建数据库,表明和实体bean名称相对应
九运行:
    jboss不需要一个client jar文件,只要把$jboss_home/client下的jar加到classpath下
    就可运行,另外jboss需要一个jndi.properties文件,也需要放到classpath下
   
    如果通过jcreator pro 运行client实例,把jndi.properties文件放到java文件同目录下即可
    如果有找不到类的异常抛出,可以在jcreator中手工手工加入相关包,jbossall-client.jar
    jnp_client.jar 这两个文件在$jboss_home/client目录下
   
好了,到此结束大家运行一下试试看

  let't go!!!
 
 
  相关附件提供了所有类及配置文件,以及数据源配置文件
 
 
  参考资料:http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/java-onlinecourse-bytitle/991A4E2DCA2D6CE148256BCE00135FAE?OpenDocument
 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页