【配置Jboss服务器略】
【创建EJB工程】
新建一个包 pk ,分别建立 远程接口 Query 、Home接口QueryHome和实现类QueryBean,代码如下:
【Query.java】
package pk;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface Query extends EJBObject {
//创建远程接口,让客户调用以下商业方法
public String getInfo() throws RemoteException;
}
【QueryHome.java】
package pk;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface QueryHome extends EJBHome {
//创建远程home接口,让客户查找到Bean
public Query create() throws CreateException,RemoteException;
}
【QueryBean.java】
package pk;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class QueryBean implements SessionBean {
public QueryBean() {
System.out.println("QueryBean");
}
//商业方法
public String getInfo() throws RemoteException {
return "当前时间:"+(new java.util.Date()).toLocaleString();
}
public void ejbActivate() throws EJBException, RemoteException {
System.out.println("ejbActivate");
}
public void ejbPassivate() throws EJBException, RemoteException {
System.out.println("ejbPassivate");
}
public void ejbRemove() throws EJBException, RemoteException {
System.out.println("ejbRemove");
}
public void setSessionContext(SessionContext ctx) throws EJBException,
RemoteException {
System.out.println("setSessionContext");
}
public void ejbCreate() throws CreateException,RemoteException{
System.out.println("ejbCreate");
}
}
【修改配置文件】
在META-INF目录下创建ejb-jar.xml和jboss.xml,代码如下:
【ejb-jar.xml】
<?xml version="1.0" encoding="UTF-8"?>
<!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></description>
<enterprise-beans>
<session>
<display-name>query</display-name><!-- 显示信息 -->
<ejb-name>Query</ejb-name><!-- 定义EJB的名称 -->
<home>pk.QueryHome</home><!-- 配置home接口 -->
<remote>pk.Query</remote><!-- 配置远程接口 -->
<ejb-class>pk.QueryBean</ejb-class><!-- 配置实现类 -->
<session-type>Stateless</session-type><!-- 配置sessionBean的类型 -->
<transaction-type>Container</transaction-type><!-- 配置Bean的管理方式 -->
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<description></description>
<method>
<ejb-name>Query</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 2.4//EN" "http://www.jboss.org/j2ee/dtd/jboss_2_4.dtd">
<jboss>
<enterprise-beans>
<session>
<ejb-name>Query</ejb-name>
<jndi-name>MyQuery</jndi-name>
</session>
</enterprise-beans>
<resource-managers></resource-managers>
</jboss>
【导出jar文件】用Myeclipse自带的功能导出或者手动打包。
【发布EJB】启动Jboss,将导出的jar包拷贝到%JbossHome%/server/default/deploy目录下
如果控制台有以下信息则说明发布成功:
16:08:51,343 INFO [EjbModule] Deploying Query
16:08:51,750 INFO [ProxyFactory] Bound EJB Home 'Query' to jndi 'MyQuery'
16:08:51,765 INFO [EJBDeployer] Deployed: file:/D:/Program Files/jboss- 4.0.4.GA/server/default/deploy/QueryEJB.jar
如果没有以上信息,而是抛出一堆的异常信息,则可能是Ejb的代码有问题,仔细查看提升修改后重新部署即可。
至此,EJB的开发和部署工作完成了。下面就是用客户端来访问服务器上的Ejb
【客户端访问】
准备工作:
1)将EJB工程的远程接口和home接口导出为jar包(实现类QueryBean不必了,因为Ejb的本意就是隐藏实现代码的,只提供访问接口),然后添加到客户端的构建路径;
2)将Jboss目录下的Client目录中的jar包添加至构建路径。
编写客户端代码,Test.java 代码如下:
package pk;
import java.rmi.RemoteException;
import java.util.Hashtable;
import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
public class Test {
public static void main(String args[]) throws CreateException {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
env.put(Context.PROVIDER_URL, "localhost:1099");
env.put("java.naming.factory.url.pkgs",
"org.jboss.naming:org.jnp.interfaces");
Context ctx;
try {
ctx = new InitialContext(env);
Object obj = ctx.lookup("MyQuery");
QueryHome home = (QueryHome) PortableRemoteObject.narrow(obj,
QueryHome.class);
Query q = (Query) home.create();
System.out.println(q.getInfo());
} catch (NamingException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
运行测试类,看看效果如何。