您的位置:首页 > 编程语言 > Java开发

MyEclipse+Jboss下的EJB开发(EJB 2.x)

2010-01-19 22:21 225 查看
【配置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();
  }
 }
}

运行测试类,看看效果如何。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息