中国电信网上营业厅项目是使用ejb2.0开发的,在项目中已有的框架中修修补补,也没写过一个HelloWorld的例子,今天朝花夕拾,写一个例子
步骤:
1.在eclipse下新建一个java项目.命名叫 ejb2test
2.在项目的根目录下建立 META-INF 文件夹,主要是为了存放ejb-jar.xml, jboss.xml
3.在src文件夹下建立 两个包 cn.com.xinli.ejb ,cn.com.xinli.test
4.到入需要的jar包到classpath中, jboss-j2ee.jar,这个jar包可以在 %jbossHome%/server/default/lib中找到
5.下面开始写代码,一个ejb需要写两个接口和一个实现类.
在cn.com.xinli.ejb
先写本地接口 HelloWorldHome.java
- package cn.com.xinli.ejb;
- import java.rmi.RemoteException;
- import javax.ejb.CreateException;
- import javax.ejb.EJBHome;
- public interface HelloWorldHome extends EJBHome
- {
- HelloWorldRemote create() throws RemoteException, CreateException;
- }
package cn.com.xinli.ejb;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface HelloWorldHome extends EJBHome
{
HelloWorldRemote create() throws RemoteException, CreateException;
}
远程接口: HelloWorldRemote.java
- package cn.com.xinli.ejb;
- import java.rmi.RemoteException;
- import javax.ejb.EJBObject;
- public interface HelloWorldRemote extends EJBObject
- {
- String sayHello() throws RemoteException;
- }
package cn.com.xinli.ejb;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface HelloWorldRemote extends EJBObject
{
String sayHello() throws RemoteException;
}
实现Bean类:HelloWorldBean.java (必须有会话bean的5个状态,可以为空实现,和远程接口中要实现的方法,网厅项目中是又把实现方法写在一个类里,每次 new一个类的对象,返回一个实现方法给Bean)
- package cn.com.xinli.ejb;
- import java.rmi.RemoteException;
- import javax.ejb.EJBException;
- import javax.ejb.SessionBean;
- import javax.ejb.SessionContext;
- public class HelloWorldBean implements SessionBean
- {
- public void setSessionContext(SessionContext arg0) throws EJBException, RemoteException
- {
- System.out.println("set session context");
- }
- public void ejbCreate() throws EJBException
- {
- System.out.println("ejb create");
- }
- public void ejbRemove() throws EJBException, RemoteException
- {
- System.out.println("ejb remove");
- }
- public void ejbActivate() throws EJBException, RemoteException
- {
- System.out.println("ejb activate");
- }
- public void ejbPassivate() throws EJBException, RemoteException
- {
- System.out.println("ejb passivate");
- }
- public String sayHello() throws RemoteException
- {
- return "Welecome to ejb2.0,HXL";
- }
- }
package cn.com.xinli.ejb;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class HelloWorldBean implements SessionBean
{
public void setSessionContext(SessionContext arg0) throws EJBException, RemoteException
{
System.out.println("set session context");
}
public void ejbCreate() throws EJBException
{
System.out.println("ejb create");
}
public void ejbRemove() throws EJBException, RemoteException
{
System.out.println("ejb remove");
}
public void ejbActivate() throws EJBException, RemoteException
{
System.out.println("ejb activate");
}
public void ejbPassivate() throws EJBException, RemoteException
{
System.out.println("ejb passivate");
}
public String sayHello() throws RemoteException
{
return "Welecome to ejb2.0,HXL";
}
}
6.写配置文件在META-INF 目录下,这个目录的名字不能改变(这里我们是一个有状态的回话bean)
ejb-jar.xml
- <?xml version="1.0" encoding="gb2312"?>
- <!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>
- <description>ejb</description>
- <display-name>myEJBTest</display-name>
- <enterprise-beans>
- <session>
- <display-name>helloEJB</display-name>
- <ejb-name>helloEJB</ejb-name>
- <home>cn.com.xinli.ejb.HelloWorldHome</home>
- <remote>
- cn.com.xinli.ejb.HelloWorldRemote
- </remote>
- <ejb-class>
- cn.com.xinli.ejb.HelloWorldBean
- </ejb-class>
- <session-type>Stateful</session-type>
- <transaction-type>Bean</transaction-type>
- </session>
- </enterprise-beans>
- </ejb-jar>
jboss.xml (其中)<jndi-name>元素的值必须在容器中唯一
- <?xml version="1.0" encoding="gb2312"?>
- <jboss>
- <enterprise-beans>
- <session>
- <ejb-name>helloEJB</ejb-name>
- <jndi-name>ejb/helloEJB</jndi-name>
- </session>
- </enterprise-beans>
- </jboss>
7.把项目打成jar包发布在ejb容器中,我使用的是Jboss,大包后放在 %JbossHome%/server/default/deploy下
打包我们可以用eclipse ,在项目上点右键->Export->Jar File-> 记得要选择generate 就可以了,也可以使用 jar cvf 命令来打jar包
8.启动Jboss,我们会看到我们发布的ejb,如果没有错误的话
9.下面我们写一个测试,首先我们要导入 jboss-client.jar 到classpath 下,这个jar包在 %JbossHome%/client下
Test.java
- package cn.com.xinli.ejb.test;
- import java.util.Properties;
- import javax.naming.InitialContext;
- import javax.rmi.PortableRemoteObject;
- import org.apache.log4j.Logger;
- import cn.com.xinli.ejb.HelloWorldHome;
- import cn.com.xinli.ejb.HelloWorldRemote;
- public class Test
- {
- static Logger log=Logger.getLogger(Test.class);
- /**
- * @param args
- */
- public static void main(String[] args)
- {
- System.out.println("===========================================================");
- Properties props = new Properties();
- props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
- props.setProperty("java.naming.provider.url", "localhost:1099");
- props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
- try
- {
- InitialContext ctx = new InitialContext(props);
- Object objRef = ctx.lookup("ejb/helloEJB");
- HelloWorldHome home = (HelloWorldHome) PortableRemoteObject.narrow(objRef, HelloWorldHome.class);
- HelloWorldRemote remote = home.create();
- log.info(remote.sayHello());
- }
- catch (Exception ex)
- {
- ex.printStackTrace();
- }
- }
- }
package cn.com.xinli.ejb.test;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import org.apache.log4j.Logger;
import cn.com.xinli.ejb.HelloWorldHome;
import cn.com.xinli.ejb.HelloWorldRemote;
public class Test
{
static Logger log=Logger.getLogger(Test.class);
/**
* @param args
*/
public static void main(String[] args)
{
System.out.println("===========================================================");
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url", "localhost:1099");
props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");
try
{
InitialContext ctx = new InitialContext(props);
Object objRef = ctx.lookup("ejb/helloEJB");
HelloWorldHome home = (HelloWorldHome) PortableRemoteObject.narrow(objRef, HelloWorldHome.class);
HelloWorldRemote remote = home.create();
log.info(remote.sayHello());
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}
10.结果:
===========================================================
0 [main] INFO cn.com.xinli.ejb.test.Test(38) - Welecome to ejb2.0,HXL
到此,我们就完成了一个ejb2.0 HelloWorld 的开发
在ejb-jar.xml 中,我们将<session-type> </session-type> 元素的值修改为Stateless,就是一个无状态的回话bean了,无状态的会话bean也是使用的最多的bean了.