从jboss\docs\examples\jca\目录下复制mysql-ds.xml文件到jboss\server\default\deploy目录,需要做一点修改。
<?
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&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条数据。
六、完整的源码
/*
* 创建日期 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);
}
/*
* 创建日期 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);
}
}
/*
* 创建日期 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();
}
}
后记:
这些代码需要保存好,后面会在此基础上进一步扩展,开发含有更复杂联系的程序。
下篇文章讲述如何设计一对一的双向联系。