EJB-CMP 的例子,其实程序不难写,关键是部署,部署的时候找资料,看文档,好歹终于做出来了。例子主要
演示了使用SESSION-BEAN ,ENTITY-BEAN 来进行数据库持久化操作。
首先声明部署环境是 JBOSS4.0.2GA,JDK需要1.5。DATABASE-- 使用的是 MSSQLSERVER2000.
首先是LOCAL 接口。
package cmp2bean;
import javax.ejb.EJBLocalHome;
import javax.ejb.EJBLocalObject;
public interface Contact extends EJBLocalObject {
public void setFirst(String first);
public void setLast(String last);
public void setEmail(String email);
public String getFirst();
public String getLast();
public String getEmail();
}
其次是LOCALHOME 接口
package cmp2bean;
import javax.ejb.CreateException;
import javax.ejb.EJBLocalHome;
import javax.ejb.FinderException;
public interface ContactHome extends EJBLocalHome{
public Contact create(String last) throws CreateException;
public Contact findByPrimaryKey(String last) throws FinderException;
}
3.开发ENTITY-BEAN
package cmp2bean;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.EntityBean;
import javax.ejb.EntityContext;
import javax.ejb.RemoveException;
abstract public class ContactBean implements EntityBean {
private EntityContext entityContext;
public abstract void setFirst(String first);
public abstract void setLast(String last);
public abstract void setEmail(String email);
public abstract String getFirst();
public abstract String getLast();
public abstract String getEmail();
public String ejbCreate(String last) throws CreateException
{
setLast(last);
return null;
}
public void ejbPostCreate(String last) throws CreateException
{
}
public void ejbActivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void ejbLoad() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void ejbPassivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void ejbRemove() throws RemoveException, EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void ejbStore() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void setEntityContext(EntityContext arg0) throws EJBException, RemoteException {
// TODO Auto-generated method stub
this.entityContext = arg0;
}
public void unsetEntityContext() throws EJBException, RemoteException {
// TODO Auto-generated method stub
this.entityContext = null;
}
}
4.声明远程接口。
package cmp2bean;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface RemoteContact extends EJBObject {
public void displayPerson(String last) throws RemoteException;
public void insertPerson(String first,String last,String email) throws RemoteException;
}
5.声明远程的HOME接口
package cmp2bean;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface RemoteContactHome extends EJBHome{
public RemoteContact create() throws CreateException,RemoteException;
}
6.最后是SESSION -BEAN 的代码。
package cmp2bean;
import java.rmi.RemoteException;
import java.util.Properties;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
public class ContactSessionBean implements SessionBean{
private SessionContext sessionContext;
private Contact contact;
private ContactHome contactHome;
public void ejbCreate() throws CreateException
{
}
public void ejbActivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void ejbPassivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void ejbRemove() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void setSessionContext(SessionContext arg0) throws EJBException, RemoteException {
// TODO Auto-generated method stub
this.sessionContext = arg0;
}
private Context getInitialContext() throws Exception
{
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "localhost:1099");
env.put(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");
return new InitialContext(env);
}
public void displayPerson(String last)
{
try
{
Context ctx = getInitialContext();
Object ref = ctx.lookup("ContactEntity");
contactHome = (ContactHome) PortableRemoteObject.narrow(ref,ContactHome.class);
contact = contactHome.findByPrimaryKey(last);
System.out.println("getFirst--->"+contact.getFirst());
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void insertPerson(String first,String last ,String email)
{
try
{
Context ctx = getInitialContext();
Object ref = ctx.lookup("ContactEntity");
contactHome = (ContactHome) PortableRemoteObject.narrow(ref,ContactHome.class);
contact = contactHome.create(last);
contact.setEmail(email);
contact.setFirst(first);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
7.部署需要的XML文件有3个,分别是ejb-jar.xml,jboss.xml,jbosscmp-jdbc.xml
ejb-jar.xml 文件的内容如下:
<?xml version="1.0"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"> <ejb-jar> <enterprise-beans> <session> <ejb-name>ContactEJB</ejb-name> <home>cmp2bean.RemoteContactHome</home> <remote>cmp2bean.RemoteContact</remote> <ejb-class>cmp2bean.ContactSessionBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> <entity> <ejb-name>ContactBean</ejb-name> <local-home>cmp2bean.ContactHome</local-home> <local>cmp2bean.Contact</local> <ejb-class>cmp2bean.ContactBean</ejb-class> <persistence-type>Container</persistence-type> <prim-key-class>java.lang.String</prim-key-class> <reentrant>false</reentrant> <abstract-schema-name>ContactBean</abstract-schema-name> <cmp-field> <field-name>last</field-name> </cmp-field> <cmp-field> <field-name>email</field-name> </cmp-field> <cmp-field> <field-name>first</field-name> </cmp-field> <primkey-field>last</primkey-field> <resource-ref> <res-ref-name>MSSQLDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <!--<jndi-name>java:/MSSQLDS</jndi-name>--> </resource-ref> </entity> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>ContactEJB</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> <container-transaction> <method> <ejb-name>ContactBean</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 4.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd"> <jboss> <enterprise-beans> <entity> <ejb-name>ContactBean</ejb-name> <local-jndi-name>ContactEntity</local-jndi-name> <resource-ref> <res-ref-name>MSSQLDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> <jndi-name>java:/MSSQLDS</jndi-name> </resource-ref> </entity> <session> <ejb-name>ContactEJB</ejb-name> <jndi-name>ejb/Contact</jndi-name> </session> </enterprise-beans> </jboss>
jbosscmp-jdbc.xml 文件内容如下:
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE jbosscmp-jdbc PUBLIC "-//JBoss//DTD JBOSSCMP-JDBC 4.0//EN" "http://www.jboss.org/j2ee/dtd/jbosscmp-jdbc_4_0.dtd"> <jbosscmp-jdbc> <defaults> <datasource>java:MSSQLDS</datasource> <datasource-mapping>MS SQLSERVER2000</datasource-mapping> </defaults> <enterprise-beans> <entity> <ejb-name>ContactBean</ejb-name> <create-table>true</create-table> <remove-table>false</remove-table> <table-name>Contact</table-name> <cmp-field> <field-name>first</field-name> <column-name>firstName</column-name> <jdbc-type>VARCHAR</jdbc-type> <sql-type>VARCHAR(50)</sql-type> </cmp-field> <cmp-field> <field-name>last</field-name> <column-name>LASTNAME</column-name> <jdbc-type>VARCHAR</jdbc-type> <sql-type>VARCHAR(50)</sql-type> </cmp-field> <cmp-field> <field-name>email</field-name> <column-name>email</column-name> <jdbc-type>VARCHAR</jdbc-type> <sql-type>VARCHAR(50)</sql-type> </cmp-field> </entity> </enterprise-beans> </jbosscmp-jdbc>
8.把程序打包成.JAR ,然后把三个XML放到 .JAR/META-INF/ 目录下。
9.把.JAR 文件部署到JBOSS/SERVER/DEFAUTL/DEPLOY/ 目录下。
10.开发客户端程序进行测试。
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import cmp2bean.RemoteContact;
import cmp2bean.RemoteContactHome;
public class ClientTest {
public static void main(String[] args) throws Exception{
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "localhost:1099");
env.put(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");
Context initial = new InitialContext(env);
Object objref = initial.lookup("ejb/Contact");
RemoteContactHome rch = (RemoteContactHome) PortableRemoteObject.narrow(objref,RemoteContactHome.class);
RemoteContact rc = rch.create();
rc.insertPerson("java","jakarta","apache@yahoo.com.cn");
//rc.displayPerson("mzy");
System.out.println("procedure end!!!");
}
}