站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Eclipse 专题Eclipse快速上手EJB -- 2. 设计一个实体Bean

Eclipse快速上手EJB -- 2. 设计一个实体Bean

摘要: Eclipse快速上手EJB -- 2. 设计一个实体Bean
这个系列文章我是根据 Rick Hightower 发表在 IBM 网站的文章 《EJB - CMP/CMR 介绍》 改编而成的,看这篇文章前一定要参考一下,这样理解起来很方便。关于 CMP 方面的知识我不说了,我这里只是介绍如何使用 Lomboz 和 JBoss-IDE 在Eclipse 中开发 CMP。 在看这篇文章之前,需要对开发环境的配置了解清楚,这一点我在前篇文章《Eclipse快速上手EJB -- 1. Lomboz + JBoss-IDE 配置1+2 》 中已经详细介绍了,这篇文章就是以它为前提进行的。 一、JBoss相关配置 在 《快速上手 MySQL --图形化操作详解 》 中谈到的mysql-connector-java-3.0.16-ga.zip现在有了用场,将其解压,会发现其中有一个文件 mysql-connector-java-3.0.16-ga-bin.jar,它就是 MySQL的驱动程序。把它复制到F:\java\jboss\server\default\lib 目录下,这里 F:\java\jboss 是JBoss的安装目录。 从jboss\docs\examples\jca\目录下复制mysql-ds.xml文件到jboss\server\default\deploy目录,需要做一点修改。

mysql-ds.xml

<?xml version="1.0" encoding="UTF-8"?>

这是修改后的文件,很简单,注意用户名和密码替换成自己的,还有就是使用的数据库是“cmp_sample”,如果没有这个数据库,那么先在MySQL中建立它。使用GBK进行编码,解决了中文问题(结合《快速上手 MySQL --图形化操作详解 》中 MySQL 的配置)。 二、建立项目 新建一个 Lomboz J2EE Project:
·项目名:CMP_Sample ·EJB Modules:cmpEJB ·Targeted Server: JBoss 4.0.0
继续在 CMP_Sample 项目中,右击“src” ->新建 ->Lomboz EJB Creation Wizard : · 包(K) :javamxj.ejb.cmp · 名称(M): User · EJB Type: 选择 Container Managed Entity EJB 点击下一步。 同样,再增加一个密码栏: · Field: password, · Field Type: java.lang.String, · Database Column: 密码, · SQL Type: varchar 这个不要使它成为主键。 最后点击完成。 三、验证配置 · 现在修改生成的 UserBean.java 文件,先添加自动创建表的语句 · 注意:如果使用自动创建表的语句,这里有个bug: 好了,现在来试验一下各种配置有没有问题: · 先将 UserBean.java 添加到 cmpEJB 模块中,然后 lomboz ->Generate EJB Classes 生成其它ejb类文件(建议看看生成的文件,弄清楚 XDoclet 的原理)。 · 运行 MySQl 服务,再通过 Lomboz 启动 JBoss 服务器。 · 然后通过 Deploy Module 部署 cmpEJB 模块,再打开MySql的客户端,会发现在 cmp_sample 数据库中已经自动生成了一个 usertable 的数据表,如图: 如果能顺利进行到这一步,那么各种配置都没问题,再开始下一阶段。 完成 ejbCreate 和 ejbPostCreate 方法: 在上面的 @ejb.bean 中添加 view-type = "local" 保存,UserBean 暂时告一段落。 四、创建会话Bean 右击 javamxj.ejb.cmp包,还是选择Lomboz EJB Creation Wizard :
· 包(K) :javamxj.ejb.cmp · 名称(M): UserManagement · EJB Type: 选择 Stateless
然后,点击“完成”,这时会生成一个 UserManagementBean.java 的文件 首先,增加一个 UserLocalHome 的变量 userHome, private UserLocalHome userHome = null; 然后右击 UserManagementBean ->J2EE ->Add Create Method(这是 JBossv-IDE 附带的): 下一步: 在生成的代码框中添加语句: userHome = UserUtil.getLocalHome(); 如下图:需要手工输入的语句已经标出来了: 添加业务方法· 增加 addUser 方法,向上面操作一样,右击 UserManagementBean ->J2EE ->Add Business Method: 在生成的代码框中添加语句: UserLocal user = userHome.create(email, password); · 增加 removeUser 方法 在生成的代码框中添加语句: userHome.remove(email); · 增加 verifyPassword 方法 在生成的代码框中添加语句: UserLocal user = userHome.findByPrimaryKey(email);
return user.getPassword().equals(password);
为了将 UserBean 与 UserManagementBean 联系起来,在上面注释中添加: * view-type = "remote" * @ejb.ejb-ref ejb-name = "User"
* view-type = "local"
* ref-name = "ejb/UserLocal"
*
* @jboss.ejb-local-ref ref-name = "UserLocal"
* jndi-name = "UserLocal"
如图: 好了,UserManagementBean 暂时完成了。 将 UserManagementBean 加入到 cmpEJB 模块中, · 然后 lomboz ->Generate EJB Classes
· 运行 MySQl 服务,再通过 Lomboz 启动 JBoss 服务器。 · 然后通过 Deploy Module 部署 cmpEJB 模块 如果一切正常,那么开始创建客户端。
五、创建客户端 · 右击 src 文件夹 ->新建 ->Lomboz EJB Test Client Wizard: · 修改生成的 CMPClient1.java · 运行客户端程序,则客户端控制台会输出:Login =true · 同时,用 MySQL 客户端软件查看 cmp_sample 表,则如下,显示3条数据。 六、完整的源码

UserBean.java

/*

 * 创建日期 2005-1-14

 *

 * 作者:javamxj(分享java快乐)

 */

package javamxj.ejb.cmp;

/**

 *

 *

 <?xml version="1.0" encoding="UTF-8"?>

 

 

 

 User

 User

 javamxj.ejb.cmp.UserBean

 Container

 java.lang.String

 2.x

 userSchema

 eamil

 

 

 email

 java.lang.String

 电子邮件

 VARCHAR

 varchar

 false

 true

 

 

 password

 java.lang.String

 密码

 VARCHAR

 varchar

 false

 false

 

 userTable

 

 

 

 *

 *

 * @ejb.bean name="User"

 * jndi-name="User"

 * type="CMP"

 *  primkey-field="email"

 *  schema="userSchema"

 *  cmp-version="2.x"

 *  view-type = "local"

 *  data-source=""

 *

 *  @ejb.persistence

 *   table-name="userTable"

 *

 * @ejb.finder

 *    query="SELECT OBJECT(a) FROM userSchema as a" 

 *    signature="java.util.Collection findAll()" 

 *

 * @jboss.persistence create-table = "true"

 *                    remove-table = "false"

 *

 * @ejb.pk class="java.lang.String"

 *

 * @generated

 **/

public abstract class UserBean implements javax.ejb.EntityBean {

  /**

   * @ejb.create-method

   */

  public java.lang.String ejbCreate(String email, String password) throws javax.ejb.CreateException {

    // EJB 2.0 spec says return null for CMP ejbCreate methods.

 setEmail(email);

 setPassword(password);

 return null;

  }

  /**

   * The container invokes this method immediately after it calls ejbCreate.

   */

  public void ejbPostCreate(String email, String password) throws javax.ejb.CreateException {

  }

  /**

   * CMP Field email

   * @return the email

   * @ejb.persistent-field

   * @ejb.persistence

   *    column-name="电子邮件"

   *     jdbc-type="VARCHAR"

   *     sql-type="varchar(64)"

   *     read-only="false"

   * @ejb.pk-field

   *

   * @ejb.interface-method

   */

  public abstract java.lang.String getEmail();

  /**

   * @param java.lang.String the new email value

   * @ejb.interface-method

   */

  public abstract void setEmail(java.lang.String email);

  /**

   * CMP Field password

   * @return the password

   * @ejb.persistent-field

   * @ejb.persistence

   *    column-name="密码"

   *     jdbc-type="VARCHAR"

   *     sql-type="varchar(64)"

   *     read-only="false"

   *

   * @ejb.interface-method

   */

  public abstract java.lang.String getPassword();

  /**

   * @param java.lang.String the new password value

   * @ejb.interface-method

   */

  public abstract void setPassword(java.lang.String password);

}

UserManagementBean.java

/*

 * 创建日期 2005-1-14

 *

 * 作者:javamxj(分享java快乐)

 */

package javamxj.ejb.cmp;

/**

 *

 *

 <?xml version="1.0" encoding="UTF-8"?>

 

 

 

 UserManagement

 UserManagement

 javamxj.ejb.cmp.UserManagementBean

 Stateless

 Container

 

 

 

 *

 *

 * @ejb.bean name="UserManagement"

 *           jndi-name="UserManagement"

 *           type="Stateless"

 *           transaction-type="Container"

 *           view-type = "remote"

 *

 * @ejb.ejb-ref

 *    ejb-name = "User"

 *    view-type = "local"

 *    ref-name = "ejb/UserLocal"

 *

 * @jboss.ejb-local-ref

 *     ref-name = "UserLocal" 

 *     jndi-name = "UserLocal"

 *

 *

 * @generated

 */

public abstract class UserManagementBean implements javax.ejb.SessionBean {

 private UserLocalHome userHome = null;

 /**

  * Create method

  * @ejb.create-method  view-type = "remote"

  */

 public void ejbCreate() throws javax.ejb.CreateException, javax.naming.NamingException {

  userHome = UserUtil.getLocalHome();

 }

 public void ejbPassivate() {

  userHome = null;

 }

 /**

  * Business method

  * @ejb.interface-method  view-type = "remote"

  */

 public void addUser(String email, String password)

  throws javax.ejb.CreateException {

  UserLocal user = userHome.create(email, password);

 }

 /**

  * Business method

  * @ejb.interface-method  view-type = "remote"

  */

 public void removeUser(String email) throws javax.ejb.RemoveException {

  userHome.remove(email);

 }

 /**

  * Business method

  * @ejb.interface-method  view-type = "remote"

  */

 public boolean verifyPassword(String email, String password)

  throws javax.ejb.FinderException {

  UserLocal user = userHome.findByPrimaryKey(email);

  return user.getPassword().equals(password);

 }

}

CMPClient1.java

/*

 * 创建日期 2005-1-14

 *

 * 作者:javamxj(分享java快乐)

 */

package javamxj.ejb.client;

import java.rmi.RemoteException;

import java.util.Hashtable;

import javax.ejb.CreateException;

import javax.ejb.FinderException;

import javax.ejb.RemoveException;

import javax.naming.InitialContext;

import javax.naming.NamingException;

public class CMPClient1 {

 private javamxj.ejb.cmp.UserManagementHome getHome() throws NamingException {

  return (javamxj.ejb.cmp.UserManagementHome) getContext().lookup(

    javamxj.ejb.cmp.UserManagementHome.JNDI_NAME);

 }

 private InitialContext getContext() throws NamingException {

  Hashtable props = new Hashtable();

  props.put(InitialContext.INITIAL_CONTEXT_FACTORY,

    "org.jnp.interfaces.NamingContextFactory");

  props.put(InitialContext.PROVIDER_URL, "jnp://127.0.0.1:1099");

  // This establishes the security for authorization/authentication

  // props.put(InitialContext.SECURITY_PRINCIPAL,"username");

  // props.put(InitialContext.SECURITY_CREDENTIALS,"password");

  InitialContext initialContext = new InitialContext(props);

  return initialContext;

 }

 public void testBean() {

  try {

   javamxj.ejb.cmp.UserManagement myBean = getHome().create();

  

   // 增加4个用户

   myBean.addUser("rick@rickhightower.com", "mypassword");

   myBean.addUser("nick@rickhightower.com", "oxford");

   myBean.addUser("javamxj@yahoo.com.cn", "分享Java快乐");

   myBean.addUser("aaa@bbb.com","ccc");

  

   // 验证用户和密码是否相符

   boolean login = false;

   login = myBean.verifyPassword("javamxj@yahoo.com.cn", "分享Java快乐");

   System.out.println("Login =" + login);  

  

   // 删除用户

   myBean.removeUser("aaa@bbb.com");

           

   //--------------------------------------

   //This is the place you make your calls.

   //System.out.println(myBean.callYourMethod());

  } catch (RemoteException e) {

   e.printStackTrace();

  } catch (CreateException e) {

   e.printStackTrace();

  } catch (NamingException e) {

   e.printStackTrace();

  } catch (FinderException e) {

   e.printStackTrace();

  } catch (RemoveException e) {

   e.printStackTrace();

  }

 }

 public static void main(String[] args) {

  CMPClient1 test = new CMPClient1();

  test.testBean();

 }

}

后记: 这些代码需要保存好,后面会在此基础上进一步扩展,开发含有更复杂联系的程序。 下篇文章讲述如何设计一对一的双向联系。



↑返回目录
前一篇: Eclipse3.0开发Hibernate之配置篇
后一篇: Eclipse快速上手EJB -- 1. Lomboz + JBoss-IDE 配置1