该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