终于把EJB的例子完成了,从WWW上搜索的内容太多,而且有的只贴代码,不讲部署。这次把前后的步骤都列出来,以免以后给忘记了。
首先,服务器环境,jboss-4.0.5.GA,需要安装JDK1.5 或者更高版本。
其次是JAVA代码:
package test;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface Hello extends EJBObject
{
public String sayHello() throws RemoteException;
}
package test;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface HelloHome extends EJBHome
{
Hello create() throws CreateException,RemoteException;
}
最后是会话BEAN
package test;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class HelloBean implements SessionBean
{
private SessionContext ctx;
private String word;
public void ejbActivate() throws EJBException, RemoteException
{
}
public void ejbPassivate() throws EJBException, RemoteException
{
}
public void ejbRemove() throws EJBException, RemoteException
{
}
public void ejbCreate() throws CreateException
{
word = "Hello World!";
}
public String sayHello()
{
System.out.println("I am an EJB Of Server..." + word);
return word;
}
public void setSessionContext(SessionContext context) throws EJBException, RemoteException
{
this.ctx = context;
}
}
若要编译上面的.JAVA文件,需要 jnp-client.jar jboss-j2ee.jar jbossall-client.jar
同时还需要建立一个META-INF目录,把必须的文件COPY进去。
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>HelloHome</ejb-name> <home>test.HelloHome</home> <remote>test.Hello</remote> <ejb-class>test.HelloBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>HelloHome</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar>
要部署到JBOSS 容器中,还需要 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>
<session>
<ejb-name>HelloHome</ejb-name>
<jndi-name>ejb/MyFirstEJB</jndi-name>
</session>
</enterprise-beans>
</jboss>
使用工具打包成 .jar 注意把 META-INF 目录下的内容要打包进去。然后部署到JBOSS 应用中。
部署成功的话,应该可以看到如下的信息。
INFO [ProxyFactory] Bound EJB Home 'HelloHome' to jndi 'ejb/MyFirstEJB'
部署成功后,写CLIENT 进行测试。
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import test.Hello;
import test.HelloHome;
/**
* <p/>创 建 人:孟昭熠
* <p/>创建日期:2008-6-20
* <p/>创建时间:17:16:09
* <p/>功能描述:
* <p/>==============================================================
* <p/>修改历史
* <p/>修改人 修改时间 修改原因
* <p/>==============================================================
*/
public class HelloClientTest {
/**
* @param args
*/
public static void main(String[] args) {
try {
// 创建一个JNDI naming contest
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);
// 从JNDI 中以MyConverter 名子来定位到对象(在发布名称指定了JNDI名称)
//Object objref = initial.lookup("java:comp/env/ejb/MyFirstEJB");
Object objref = initial.lookup("ejb/MyFirstEJB");
// 通过objref 得到ConverterHome 本地接口
HelloHome home = (HelloHome)PortableRemoteObject.narrow(
objref, HelloHome.class);
// 再由Home 接口的create 方法来创建一个服务器上的EJB实例
Hello hello = home.create();
// 调用EJB 中的方法
System.out.println(hello.sayHello());
}
catch(Exception ex){
System.err.println("Caught an unexpected exception!");
ex.printStackTrace();
}
}
}
至此,调用成功后结束。会看到JBOSS服务器有内容输出。
INFO [STDOUT] I am an EJB Of Server...Hello World!