注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 《掌控Windows SErver 2..
 帮助

SeesionBean work with EntityBean of EJB2.1


2009-07-02 15:46:44
版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://danni505.blog.51cto.com/15547/172297
Intro
This article is base of  JSF call EJB comp Demo , it maybe more deeper than that article, than one is just use SLSB, and here we will use all things except MB of EJB1.2, Now i will show you an whole EJB2.1+JSF+CMP case.
 
Background knowledge
In EJB, EntityBean should not be called directly, it should use in SessionBean,and for cilent when using SB, it should been use by which home interface, and call create() to create an SB handler, then you can use this handler do which provide, in other words, this EJB comp provide to you.
 
And to EntityBean, it should used in SessionBean, attention, which not need to create, becuse in you deploy, it register to App server's JDNI. So you just have get this resource,  in other words, you just need get which home hander.
 
When mention JDNI, make a not at here, in contianer it should use like it
==============
COMP_NAME="java:comp/env/ejb/UserSessionLocal";
==============
while outside should use
================
JNDI_NAME="UserSessionLocal";
================
 
Another question is we should remember all the time, if we want to add an method to comp, which should register in all interface file, it same between SB and EB, not forget this, if not, you will find in client side, you couldnot get your useful-method definded in comp.
 
Ok, follow me, let's have a look this  typical case.
 
Main Code and XML
 
EntityBean
UserBean.java
package ejbBeans;
/**
* Local home interface for UserData.
*/

public interface UserLocalHome
     extends javax.ejb.EJBLocalHome
{
     public static final String COMP_NAME="java:comp/env/ejb/UserLocal";
     public static final String JNDI_NAME="UserLocal";

     public UserLocal create(java.lang.Integer id,java.lang.String name )
            throws javax.ejb.CreateException;

     public UserLocal findByName(java.lang.String name)
            throws javax.ejb.FinderException;

     @SuppressWarnings("unchecked")
     public java.util.Collection findAll()
            throws javax.ejb.FinderException;

     public UserLocal findByPrimaryKey(java.lang.Integer pk)
            throws javax.ejb.FinderException;

}
 
UserLocalHome.java
package ejbBeans;
/**
* Local home interface for UserData.
*/

public interface UserLocalHome
     extends javax.ejb.EJBLocalHome
{
     public static final String COMP_NAME="java:comp/env/ejb/UserLocal";
     public static final String JNDI_NAME="UserLocal";

     public UserLocal create(java.lang.Integer id,java.lang.String name )
            throws javax.ejb.CreateException;

     public UserLocal findByName(java.lang.String name)
            throws javax.ejb.FinderException;

     @SuppressWarnings("unchecked")
     public java.util.Collection findAll()
            throws javax.ejb.FinderException;

     public UserLocal findByPrimaryKey(java.lang.Integer pk)
            throws javax.ejb.FinderException;

}
 
 
SessionBean
LocalUserSessionBean.java
package ejbBeans;

import java.util.Collection;

import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.FinderException;
import javax.ejb.RemoveException;

import base.BaseSessionBean;

public class LocalUserSessionBean extends BaseSessionBean{

  /**
    *    
    */

  private static final long serialVersionUID = 5028163905841527500L;
  /**
         * The local home interface of user    entity bean.
         */

  private UserLocalHome userdatahome=null;
    
  /**
         * Default create for SessionBean.
         *
         * @throws CreateException if bean instance can't be created
         * @see org.ejbca.core.model.log.Admin
         */

        public void ejbCreate() throws CreateException {
          userdatahome=(UserLocalHome)getLocator().getLocalHome(UserLocalHome.COMP_NAME);
        }
        
        @SuppressWarnings("unchecked")
  public Collection getAllUser(){
          Collection usercollection=null;
          try {
      usercollection=userdatahome.findAll();
    } catch (FinderException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
          return usercollection;
        }
        
        /**
         * Returns a user data source id, given it's user data source name
         *
         * @return the id or 0 if the user data source cannot be found.
         * @ejb.transaction type="Supports"
         * @ejb.interface-method view-type="both"
         */

        public int getUserInfoId(String name) {
                int returnval = 0;
                if (userdatahome!=null || !userdatahome.equals(null)) {
      System.out.println("userdatahome is not null");
    }
                
                try {
                  //add    
                  /*UserLocal userdata=userdatahome.create(3,"testuser3");
                        System.out.println("userdata create"+userdata.getAddress());
                        */

                        
                        //read
                  System.out.println("Test1: findByName");
                  System.out.println("name:"+name);                    
                        Integer id = (userdatahome.findByName(name)).getId();
                        returnval = id.intValue();
                        System.out.println("get id:"+id);    
                        
                        //read again                        
                        System.out.println("Test2: findByPrimaryKey");
                        UserLocal user=userdatahome.findByPrimaryKey(returnval);
                        System.out.println("get address of id=:"+returnval+","+user.getAddress());
                        
                        //delete way1
                        UserLocal userdemo=userdatahome.findByPrimaryKey(returnval);
                        userdemo.remove();
                        System.out.println("delete user by id:"+returnval+"which name"+name);
                        
                        //delete way2 - not pass test                        
//                        UserVO userobj=new UserVO(name);
//                        userdatahome.remove(userobj);
//                        System.out.println("delete userobj by name:"+name);
                        
                } catch (FinderException e) {
                  e.printStackTrace();
                }
//             catch (CreateException e) {
//      // TODO Auto-generated catch block
//      e.printStackTrace();
//    }
                catch (EJBException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (RemoveException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

                return returnval;
        } // getUserDataSourceId
        
        
        /**
         * Just a test ejb comp call method
         * @param str
         * @return
         */

    public String setString(java.lang.String str ){    
     return "Do some job and return your enter str as:"+str;
    }
}
 
IUserSessionHome.java
/**
*    
*/

package ejbBeans;

/**
* Home interface for UserAdminSession.
*/

public interface IUserSessionHome
     extends javax.ejb.EJBHome
{
     public static final String COMP_NAME="java:comp/env/ejb/UserSession";
     public static final String JNDI_NAME="UserSession";

     public IUserSessionRemote create()
            throws javax.ejb.CreateException,java.rmi.RemoteException;

}
 
XML
 
ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>

<ejb-jar id="ejb-jar_1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd" version="2.1">

     <description><![CDATA[MyEJB generated by eclipse wtp xdoclet extension.]]></description>
     <display-name>MyEJB</display-name>

     <enterprise-beans>

            <!-- Session Beans -->            
            

    <session id="Session_UserAdminSession">
                 <description><![CDATA[Administrates users in the database using User Entity Bean.]]></description>


                 <ejb-name>UserSession</ejb-name>
                
                 <home>ejbBeans.IUserSessionHome</home>
                 <remote>ejbBeans.IUserSessionRemote</remote>
                 <local-home>ejbBeans.IUserSessionLocalHome</local-home>
                 <local>ejbBeans.IUserSessionLocal</local>
                 <ejb-class>ejbBeans.UserSessionSession</ejb-class>
                 <session-type>Stateless</session-type>
                 <transaction-type>Container</transaction-type>
                    
                 <env-entry>
                        <env-entry-name>DataSource</env-entry-name>
                        <env-entry-type>java.lang.String</env-entry-type>
                        <env-entry-value><![CDATA[java:/TestDS]]></env-entry-value>
                 </env-entry>
                 <env-entry>
                        <description><![CDATA[Defines the JNDI name of the mail service used]]></description>
                        <env-entry-name>MailJNDIName</env-entry-name>
                        <env-entry-type>java.lang.String</env-entry-type>
                        <env-entry-value><![CDATA[java:/EjbcaMail]]></env-entry-value>
                 </env-entry>                    
                    
                 <ejb-local-ref id="EJBLocalRef_94">
                        <ejb-ref-name>ejb/UserLocal</ejb-ref-name>
                        <ejb-ref-type>Entity</ejb-ref-type>
                        <local-home>ejbBeans.UserLocalHome</local-home>
                        <local>ejbBeans.UserLocal</local>
                        <ejb-link>User</ejb-link>
                 </ejb-local-ref>
    </session>
    
         <!--
             To add session beans that you have deployment descriptor info for, add
             a file to your XDoclet merge directory called session-beans.xml that contains
             the <session></session> markup for those beans.
        
-->

  <!-- Entity Beans -->    
  <entity id="ContainerManagedEntity_User">
                 <description><![CDATA[This enterprise bean entity represents a user]]></description>
                 <display-name>UserEB</display-name>

                 <ejb-name>User</ejb-name>

                 <local-home>ejbBeans.UserLocalHome</local-home>
                 <local>ejbBeans.UserLocal</local>

                 <ejb-class>ejbBeans.UserBean</ejb-class>
                 <persistence-type>Container</persistence-type>
                 <prim-key-class>java.lang.Integer</prim-key-class>
                 <reentrant>false</reentrant>
                 <cmp-version>2.x</cmp-version>
                 <abstract-schema-name>UserBean</abstract-schema-name>
                 <cmp-field id="CMPAttribute_180">
                        <description><![CDATA[]]></description>
                        <field-name>id</field-name>
                 </cmp-field>
                 <cmp-field id="CMPAttribute_181">
                        <description><![CDATA[]]></description>
                        <field-name>name</field-name>
                 </cmp-field>
                 <cmp-field id="CMPAttribute_182">
                        <description><![CDATA[]]></description>
                        <field-name>password</field-name>
                 </cmp-field>
                 <cmp-field id="CMPAttribute_183">
                        <description><![CDATA[]]></description>
                        <field-name>phone</field-name>
                 </cmp-field>
                 <cmp-field id="CMPAttribute_184">
                        <description><![CDATA[]]></description>
                        <field-name>address</field-name>
                 </cmp-field>
                 <primkey-field>id</primkey-field>

                 <query>
                        <description><![CDATA[findByName]]></description>
                        <query-method>
                             <method-name>findByName</method-name>
                             <method-params>
                                    <method-param>java.lang.String</method-param>
                             </method-params>
                        </query-method>
                        <ejb-ql><![CDATA[SELECT OBJECT(a) from UserBean a WHERE a.name=?1]]></ejb-ql>
                 </query>
                 <query>
                        <description><![CDATA[findAll]]></description>
                        <query-method>
                             <method-name>findAll</method-name>
                             <method-params>
                             </method-params>
                        </query-method>
                        <ejb-ql><![CDATA[SELECT OBJECT(a) from UserBean a]]></ejb-ql>
                 </query>
     <!-- Write a file named ejb-finders-UserBean.xml if you want to define extra finders. -->

            </entity>    
                    
     </enterprise-beans>
        
     <!-- assembly-descriptor -->
     <assembly-descriptor>
         <!--    container-transaction -->
         <container-transaction id="MethodTransaction_273">
             <method id="MethodElement_297">
                    <ejb-name>UserSession</ejb-name>
                     <method-name>*</method-name>
                </method>
                <trans-attribute>Required</trans-attribute>
         </container-transaction>
            
         <container-transaction id="MethodTransaction_305">
             <method id="MethodElement_329">
                    <ejb-name>UserSession</ejb-name>
                    <method-intf>Local</method-intf>
                    <method-name>setString</method-name>
                    <method-params>
                         <method-param>java.lang.String</method-param>
                    </method-params>
             </method>
             <trans-attribute>Supports</trans-attribute>
        </container-transaction>
        
         <container-transaction id="MethodTransaction_316">
             <method id="MethodElement_340">
                    <ejb-name>User</ejb-name>
                     <method-name>*</method-name>
                </method>
                <trans-attribute>Required</trans-attribute>
         </container-transaction>
        </assembly-descriptor>
        
</ejb-jar>
 
Jboss.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.2//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_2.dtd">

<jboss>
  <unauthenticated-principal>nobody</unauthenticated-principal>

  <enterprise-beans>
    
    <!--
             To add beans that you have deployment descriptor info for, add
             a file to your XDoclet merge directory called jboss-beans.xml that contains
             the <session></session>, <entity></entity> and <message-driven></message-driven>
             markup for those beans.
        
-->
            
         <entity>
                 <ejb-name>User</ejb-name>
                 <local-jndi-name>UserLocal</local-jndi-name>

                <method-attributes>
                </method-attributes>

            </entity>
            
    <session>    
                 <ejb-name>UserSession</ejb-name>
                 <jndi-name>UserSession</jndi-name>
                 <local-jndi-name>UserSessionLocal</local-jndi-name>

                <method-attributes>
                </method-attributes>                
            </session>
            
  </enterprise-beans>

</jboss>
 
jbosscmp-jdbc.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC 3.2//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_3_2.dtd">

<jbosscmp-jdbc>
  <defaults>
    <datasource>java:/TestDS</datasource>
    <datasource-mapping>mySQL</datasource-mapping>
  </defaults>

  <enterprise-beans>

    <!--
      To add beans that you have deployment descriptor info for, add a file
      to your XDoclet merge directory called jbosscmp-jdbc-beans.xml that
      contains the <entity></entity> markup for those beans.
    
-->    
    <!-- jboss 5.0.1 features -->
    <!-- optimistic locking does not express the exclusions needed -->
    <entity>
      <ejb-name>User</ejb-name>
      <table-name>user</table-name>

      <cmp-field>
        <field-name>name</field-name>
      </cmp-field>
      <cmp-field>
        <field-name>password</field-name>
      </cmp-field>
      <cmp-field>
        <field-name>id</field-name>
        <column-name>id</column-name>
      </cmp-field>
      <cmp-field>
        <field-name>phone</field-name>
      </cmp-field>
      <cmp-field>
        <field-name>address</field-name>
      </cmp-field>        
    </entity>    
  </enterprise-beans>
    
  <!--    
  To add jboss relationships for beans not managed by XDoclet, add a
      file to your XDoclet merge directory called
      jbosscmp-jdbc-relationships.xml that contains the
      <ejb-relation></ejb-relation> markups for those beans.
  
-->
    
  <!--
  <relationships>
    
    <ejb-relation>
      <ejb-relation-name>AdminGroupDataToAccessRules</ejb-relation-name>

      <ejb-relationship-role>
        <ejb-relationship-role-name>AdminGroupData</ejb-relationship-role-name>
        <key-fields>
          <key-field>
            <field-name>primKey</field-name>
            <column-name>AdminGroupData_accessRules</column-name>
          </key-field>
        </key-fields>

      </ejb-relationship-role>
      <ejb-relationship-role>
        <ejb-relationship-role-name>AccessRulesData</ejb-relationship-role-name>
        <key-fields />

      </ejb-relationship-role>
    </ejb-relation>
    
        
    
  </relationships>
  
-->
</jbosscmp-jdbc>
 
JSF
 
Main MBean
LoginMBean.java
public class LoginMBean {

  private static IUserSessionHome usersessionhome = null;
  private IUserSessionRemote usersession = null;
  private List userlist = new ArrayList();
    

  /**
    * get session bean handler
    */

  public void initialize() {
    InitialContext ctx;
    try {
      ctx = new InitialContext();
      usersessionhome = (IUserSessionHome) PortableRemoteObject.narrow(
          ctx.lookup(IUserSessionHome.JNDI_NAME),
          IUserSessionHome.class);

      usersession = usersessionhome.create();

    } catch (NamingException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (RemoteException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (CreateException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  public int getIdByUserName() throws NamingException{
    InitialContext ctx;
    int id=0;
    try {
      ctx = new InitialContext();
      usersessionhome = (IUserSessionHome) PortableRemoteObject.narrow(
          ctx.lookup(IUserSessionHome.JNDI_NAME),
          IUserSessionHome.class);

      usersession = usersessionhome.create();
      id=usersession.getUserInfoId("daniel");

    } catch (RemoteException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (CreateException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    return id;
  }
}
 
 
Index.jsp
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@page contentType="text/html; charset=utf-8" %>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
  <title> DataTable </title>    
</head>

  <body>
    <f:view>            
    <h:outputText value="#{loginMean.idByUserName}" />
    
    

    
    </f:view>
  </body>
</html>
 
 
Source Code for DownLoad
 
More Contact me by danni-505#hotmail.com

本文出自 “专注J2EE系列规范下的开源技术” 博客,请务必保留此出处http://danni505.blog.51cto.com/15547/172297


附件下载:
  EJB COMP
  Client


类别:算法 技术圈()阅读() ┆ 评论()推送到技术圈返回首页  


    文章评论
 
2009-07-24 09:47:20
修正上面一个张贴错误,源码下载中的是对的,文章中的Userbean的代码应该是:
package ejbBeans;

import javax.ejb.CreateException;

import org.apache.log4j.Logger;
import base.BaseEntityBean;


public abstract class UserBean extends BaseEntityBean {

     private static final long serialVersionUID = 5851794778590370784L;
     private static final Logger log = Logger.getLogger(UserBean.class);

  public abstract Integer getId();

  public abstract void setId(Integer id);

  public abstract String getName();

  public abstract void setName(String name);

  public abstract String getPassword();

  public abstract void setPassword(String password);
   
  public abstract String getPhone();

  public abstract void setPhone(String phone);
 
  public abstract String getAddress();

  public abstract void setAddress(String address);


  //
  // Fields required by Container
  //

  /**
  * Entity Bean holding data of a User.
  * @param name of User
  * @param id of user
  * @return caid
  * @ejb.create-method
  */
  public Integer ejbCreate(Integer id,String name) throws CreateException {
       try {            
             setId(id);
             setName(name);              
             
             log.debug("Created User "+ name);
             return new Integer(name.hashCode());
       } catch(Exception e) {
             log.error("UserData caught exception trying to create: ", e);
             throw new CreateException(e.toString());
       }
  }

  public void ejbPostCreate(Integer id,String name) {
    // Do nothing. Required.
  }
 
}

2009-07-24 09:50:05
这个bean继承自BaseEntityBean定义,BaseEntityBean是一个像Spring中用的Template模式一样的东西,其中有EJB2.1规范中定义的回调函数(尽管没有什么用但不可少!)

在具体的bean实现类中进行了ejbCreate方法的现实!

 

发表评论

昵   称:
验证码:  点击图片可刷新验证码  博客过2级,无需填写验证码
内   容: