快乐无极

java学习 以下文章全部的转载,仅供自已学习使用,非请勿入,

常用链接

统计

最新评论

Eclipse+Jboss快速上手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"?>

<!--$Id: mysql-ds.xml,v 1.3 2004/09/15 14:37:40 loubyansky Exp $-->
<!--  Datasource config for MySQL using 3.0.9 available from:
http://www.mysql.com/downloads/api-jdbc-stable.html
-->

<datasources>
  <local-tx-datasource>
    <jndi-name>MySqlDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/cmp_sample?useUnicode=true&amp;characterEncoding=GBK</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>javamxj</password>

      <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
      <metadata>
         <type-mapping>mySQL</type-mapping>
      </metadata>
  </local-tx-datasource>

</datasources>
 
    这是修改后的文件,很简单,注意用户名和密码替换成自己的,还有就是使用的数据库是“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
												;
												/**
												
												
												*
												
												
												
												
												*
												 <!
												-
												-
												 begin
												-
												user
												-
												doc 
												-
												-
												> You can insert your documentation for '
												<em>
												<b>
												UserBean
												</b>
												</em>
												'. <!
												-
												-
												 end
												-
												user
												-
												doc 
												-
												-
												> 
												*
												
												
												 <!
												-
												-
												  begin
												-
												lomboz
												-
												definition 
												-
												-
												>
												 <?xml version="
												1.0
												" encoding="UTF
												-
												8
												"?>
												 <lomboz
												:
												EJB xmlns
												:
												j2ee="
												http://java.sun.com/xml/ns/j2ee
												" xmlns
												:
												lomboz="
												http://lomboz.objectlearn.com/xml/lomboz
												">
												 <lomboz
												:
												entity>
												 <lomboz
												:
												entityEjb>
												 <j2ee
												:
												display
												-
												name>User<
												/
												j2ee
												:
												display
												-
												name>
												 <j2ee
												:
												ejb
												-
												name>User<
												/
												j2ee
												:
												ejb
												-
												name>
												 <j2ee
												:
												ejb
												-
												class>javamxj
												.
												ejb
												.
												cmp
												.
												UserBean<
												/
												j2ee
												:
												ejb
												-
												class>
												 <j2ee
												:
												persistence
												-
												type>Container<
												/
												j2ee
												:
												persistence
												-
												type>
												 <j2ee
												:
												prim
												-
												key
												-
												class>java
												.
												lang
												.
												String<
												/
												j2ee
												:
												prim
												-
												key
												-
												class>
												 <j2ee
												:
												cmp
												-
												version>
												2.
												x<
												/
												j2ee
												:
												cmp
												-
												version>
												 <j2ee
												:
												abstract
												-
												schema
												-
												name>userSchema<
												/
												j2ee
												:
												abstract
												-
												schema
												-
												name>
												 <j2ee
												:
												primkey
												-
												field>eamil<
												/
												j2ee
												:
												primkey
												-
												field>
												 <
												/
												lomboz
												:
												entityEjb>
												 <lomboz
												:
												fieldMappings>
												 <lomboz
												:
												fieldName>email<
												/
												lomboz
												:
												fieldName>
												 <lomboz
												:
												fieldType>java
												.
												lang
												.
												String<
												/
												lomboz
												:
												fieldType>
												 <lomboz
												:
												columnName>电子邮件<
												/
												lomboz
												:
												columnName>
												 <lomboz
												:
												jdbcType>VARCHAR<
												/
												lomboz
												:
												jdbcType>
												 <lomboz
												:
												sqlType>varchar<
												/
												lomboz
												:
												sqlType>
												 <lomboz
												:
												readOnly>false<
												/
												lomboz
												:
												readOnly>
												 <lomboz
												:
												primaryKey>true<
												/
												lomboz
												:
												primaryKey>
												 <
												/
												lomboz
												:
												fieldMappings>
												 <lomboz
												:
												fieldMappings>
												 <lomboz
												:
												fieldName>password<
												/
												lomboz
												:
												fieldName>
												 <lomboz
												:
												fieldType>java
												.
												lang
												.
												String<
												/
												lomboz
												:
												fieldType>
												 <lomboz
												:
												columnName>密码<
												/
												lomboz
												:
												columnName>
												 <lomboz
												:
												jdbcType>VARCHAR<
												/
												lomboz
												:
												jdbcType>
												 <lomboz
												:
												sqlType>varchar<
												/
												lomboz
												:
												sqlType>
												 <lomboz
												:
												readOnly>false<
												/
												lomboz
												:
												readOnly>
												 <lomboz
												:
												primaryKey>false<
												/
												lomboz
												:
												primaryKey>
												 <
												/
												lomboz
												:
												fieldMappings>
												 <lomboz
												:
												tableName>userTable<
												/
												lomboz
												:
												tableName>
												 <lomboz
												:
												dataSourceName><
												/
												lomboz
												:
												dataSourceName>
												 <
												/
												lomboz
												:
												entity>
												 <
												/
												lomboz
												:
												EJB>
												 <!
												-
												-
												  end
												-
												lomboz
												-
												definition 
												-
												-
												>
												
												
												*
												
												
												
												
												*
												 <!
												-
												-
												 begin
												-
												xdoclet
												-
												definition 
												-
												-
												>
												
												
												*
												
												
												@
												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"
												
												
												*
												 <!
												-
												-
												 end
												-
												xdoclet
												-
												definition 
												-
												-
												>
												
												
												*
												
												
												@
												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);
 returnnull;
  }
  /*** The container invokes this method immediately after it calls ejbCreate.   */publicvoid 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   */publicabstract java.lang.String getEmail();
  /***@param java.lang.String the new email value*@ejb.interface-method   */publicabstractvoid 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   */publicabstract java.lang.String getPassword();
  /***@param java.lang.String the new password value*@ejb.interface-method   */publicabstractvoid setPassword(java.lang.String password);
}
 
 

UserManagementBean.java

												/*
												 * 创建日期 2005-1-14
												 *
												 * 作者:javamxj(分享java快乐)
												 */
												package
												 javamxj
												.
												ejb
												.
												cmp
												;
												/**
												
												
												*
												
												
												
												
												*
												 <!
												-
												-
												 begin
												-
												user
												-
												doc 
												-
												-
												> A generated session bean <!
												-
												-
												 end
												-
												user
												-
												doc 
												-
												-
												> 
												*
												
												
												 <!
												-
												-
												 lomboz
												.
												beginDefinition 
												-
												-
												>
												 <?xml version="
												1.0
												" encoding="UTF
												-
												8
												"?>
												 <lomboz
												:
												EJB xmlns
												:
												j2ee="
												http://java.sun.com/xml/ns/j2ee
												" xmlns
												:
												lomboz="
												http://lomboz.objectlearn.com/xml/lomboz
												">
												 <lomboz
												:
												session>
												 <lomboz
												:
												sessionEjb>
												 <j2ee
												:
												display
												-
												name>UserManagement<
												/
												j2ee
												:
												display
												-
												name>
												 <j2ee
												:
												ejb
												-
												name>UserManagement<
												/
												j2ee
												:
												ejb
												-
												name>
												 <j2ee
												:
												ejb
												-
												class>javamxj
												.
												ejb
												.
												cmp
												.
												UserManagementBean<
												/
												j2ee
												:
												ejb
												-
												class>
												 <j2ee
												:
												session
												-
												type>Stateless<
												/
												j2ee
												:
												session
												-
												type>
												 <j2ee
												:
												transaction
												-
												type>Container<
												/
												j2ee
												:
												transaction
												-
												type>
												 <
												/
												lomboz
												:
												sessionEjb>
												 <
												/
												lomboz
												:
												session>
												 <
												/
												lomboz
												:
												EJB>
												 <!
												-
												-
												 lomboz
												.
												endDefinition 
												-
												-
												>
												
												
												*
												
												
												
												
												*
												 <!
												-
												-
												 begin
												-
												xdoclet
												-
												definition 
												-
												-
												> 
												
												
												*
												
												
												@
												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" 
												
												
												*
												
												
												
												
												*
												 <!
												-
												-
												 end
												-
												xdoclet
												-
												definition 
												-
												-
												> 
												
												
												*
												
												
												@
												generated
												 */
												public
												abstract
												class UserManagementBean implements javax.ejb.SessionBean {
 private UserLocalHome userHome = null;
 /*** Create method*@ejb.create-method  view-type = "remote"  */publicvoid ejbCreate() throws javax.ejb.CreateException, javax.naming.NamingException {
  userHome = UserUtil.getLocalHome();
 }
 publicvoid ejbPassivate() {
  userHome = null;
 }
 /*** Business method*@ejb.interface-method  view-type = "remote"  */publicvoid addUser(String email, String password)
  throws javax.ejb.CreateException {
  UserLocal user = userHome.create(email, password);
 }
 /*** Business method*@ejb.interface-method  view-type = "remote"  */publicvoid removeUser(String email) throws javax.ejb.RemoveException {
  userHome.remove(email);
 }
 /*** Business method*@ejb.interface-method  view-type = "remote"  */publicboolean 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 = newHashtable();
  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;
 }
 publicvoid 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();
  }
 }
 publicstaticvoid main(String[] args) {
  CMPClient1 test = new CMPClient1();
  test.testBean();
 }
}
 
 
后记:
 
    这些代码需要保存好,后面会在此基础上进一步扩展,开发含有更复杂联系的程序。
 
    下篇文章讲述如何设计一对一的双向联系。
 
 

posted on 2006-04-23 18:37 快乐无极 阅读(630) 评论(0)  编辑  收藏


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


网站导航: