在Jboss环境下Web Service调用EJB(一)

日期: 2007-12-05 作者:谈祥庆 来源:TechTarget中国

  本文描述了如何在Jboss环境下Web Service调用EJB..作者用实例代码一步一步详细描述了整个过程…既然是实战,讲究的是实用性,所以关于Jboss、Web Service和EJB的入门介绍这里就免去了,请自行查阅相关资料。好,实战正式开始!

  一.开发环境:

  1. Java SDK1.4
  2. Eclipse3.0中文版
  3. Jboss3.2应用服务器
  4. Windows 2000中文专业版

  二.环境变量的设置:

  以下是我自己机器的环境变量设置,如果是linux系统,设置有所不同:

  ANT_HOME=C:ant
  JAVA_HOME=C:j2sdk
  JBOSS_HOME=C:jboss

  最后在系统变量的path变量中追加C:jbossbin;

  三.会话Bean的编写:

  在EJB中,会话BEAN需要实现一个远程接口和一个本地接口,那我们就先实现这个两个接口:

  1.远程接口:

  我们实现的是一个人员管理的用例,这个用例包含3个方法,代码如下:
4.数据模型类:

  会话BEAN中使用到了一个Person类,该类是一个数据模型,用于数据的封装。实现上和普通的Javabean值对象没有什么区别,不过为了在网络间传递,值对象必须实现序列化接口java.io. Serializable接口,这是个空接口,仅作为标志类型,没有需要实现的方法,代码如下:

import java.io.Serializable;

/**
* @jboss-net.xml-schema urn = “person:Person”
 */
public class Person
        implements Serializable
{
    private String name;

    public Person()
    {
        this.name = “unknow”;
    }

    public Person( String name )
    {
        this.name = name;
    }

    public String toString()
    {
        StringBuffer sb = new StringBuffer();
        sb.append(“name=” + this.name + “n”);

        return sb.toString();
    }

    /**
     * @return 返回 name。
     */
    public String getName()
    {
        return name;
    }

    /**
     * @param name
     *            要设置的 name。
     */
    public void setName( String name )
    {
        this.name = name;
    }
}

  另外,在PersonManagerBean和Person类中都使用了xdoclet标志,这个是为了能通过jboss IDE插件来产生ant的build文件,然后自动生成EJB的配置文件和Web Service的配置文件。

  四.使用ant产生EJB和Web Service的配置文件

  利用ant我们可以很方便的自动生成EJB和Web Service的配置文件,省去了手工编写的麻烦。Ant的build.xml文件代码如下:

<?xml version=”1.0″ encoding=”GB2312″?>
<project name=”PersonManager” basedir=”.” default=”xdoclet”>
        <property environment=”evn” />
        <property name=”generated.dir” location=”src” />

        <path id=”xdoclet.classpath”>
                <fileset dir=”lib”>
                        <include name=”**/*.jar” />
                </fileset>
                <pathelement location=”bin” />
        </path>

        <target name=”xdoclet”>
                <taskdef classpathref=”xdoclet.classpath” classname=”xdoclet.modules.ejb.EjbDocletTask” name=”ejbdoclet” />
                <ejbdoclet ejbSpec=”2.0″ destDir=”src”>
                        <homeinterface />
                        <remoteinterface />
                        <jboss Version=”3.2″ destDir=”build/PersonManagerService/META-INF” />
                        <deploymentdescriptor destDir=”build/PersonManagerService/META-INF” />
                        <fileset dir=”src” includes=”com/ejb/sessionbean/*.java,com/pojo/*.java”>
                        </fileset>
                        <jbossnet xmlencoding=”UTF-8″ destdir=”build/PersonManagerService/META-INF” webDeploymentName=”PersonManagerService” targetNameSpace=”http://localhost:8080/pojo/person” prefix=”person” />
                </ejbdoclet>
        </target>
</project> 

package com.ejb.sessionbean;

/**
 * Remote interface for PersonManager.
 */
public interface PersonManager
   extends javax.ejb.EJBObject
{

   public com.pojo.Person getPersonByName( java.lang.String name )
      throws java.rmi.RemoteException;

   public void storePerson( com.pojo.Person person )
      throws java.rmi.RemoteException;

   public void deletePerson( java.lang.String name )
      throws java.rmi.RemoteException;

}

  PersonManager接口实现的是EJB的远程接口EJBObject,包含3个方法,描述如下:

  (1) getPersonByName方法:通过人员的姓名返回一个Person对象;

  (2) storePerson方法,通过一个Person对象参数,往人员集合中存储一个人员对象;

  (3) deletePerson方法,根据一个人员的姓名从人员集合中删除一个人员对象

  由于是远程接口,所以每个方法必须抛出RemoteException异常。

  2.本地HOME接口的实现:

  为了提高EJB的性能,如果是在同一个虚拟机中,EJB可以通过本地接口来调用方法,以提高运行速度。实现代码如下:

/*
 * Generated by XDoclet – Do not edit!
 */
package com.ejb.sessionbean;

/**
 * Home interface for PersonManager.
 */
public interface PersonManagerHome
   extends javax.ejb.EJBHome
{
   public static final String COMP_NAME=”java:comp/env/ejb/PersonManager”;
   public static final String JNDI_NAME=”PersonManagerHomeRemote”;

   public com.ejb.sessionbean.PersonManager create()
      throws javax.ejb.CreateException,java.rmi.RemoteException;

}

  PersonManagerHome接口只有一个方法,create方法,它与会话bean的具体实现类中ejbCeate方法一一对应。

  3.具体实现类:

  PersonManagerBean是会话BEAN的具体实现类,必须实现SessionBean接口,而且同时实现了在远程接口中定义的相关业务逻辑方法,具体实现代码如下

package com.ejb.sessionbean;

import java.rmi.RemoteException;
import java.util.*;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import com.pojo.*;

/**
* @ejb.bean description = “PersonManagerBean” display-name =
 *           “PersonManagerBean” jndi-name=”PersonManagerHomeRemote”
 *           name=”PersonManager” type=”Stateless” view-type=”remote”
 *           transaction-type=”Container”
 * @jboss-net.web-service urn = “PersonManagerService” expose-all = “true”
 */
public class PersonManagerBean
        implements SessionBean
{
    private SessionContext ctx;

    private static Map database;

    /**
     * @ejb.create-method
     * 
     */
    public void ejbCreate()
    {
    }

    public void setSessionContext( SessionContext ctx ) throws EJBException,
            RemoteException
    {
        // TODO 自动生成方法存根

    }

    public void ejbRemove() throws EJBException, RemoteException
    {
        // TODO 自动生成方法存根

    }

    public void ejbActivate() throws EJBException, RemoteException
    {
        // TODO 自动生成方法存根

    }

    public void ejbPassivate() throws EJBException, RemoteException
    {
        // TODO 自动生成方法存根

    }

    /**
     * @ejb.interface-method view-type = “remote”
     * @param name
     * @return
     */
    public Person getPersonByName( String name )
    {
        if (database != null)
        {
            return (Person) database.get(name);
        }

        return null;
    }

    /**
     * @ejb.interface-method view-type = “remote”
     * @param person
     */
    public void storePerson( Person person )
    {
        if (database == null)
        {
            database = new HashMap();
        }

        database.put(person.getName(), person);
    }

    /**
     * @ejb.interface-method view-type = “remote”
     * @param name
     */
    public void deletePerson( String name )
    {
        if (database != null)
        {
            database.remove(name);
        }
    }
}

 

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • 为什么开源企业的开源大旗正在褪色

    最近这几年,开源一直是人们比较关注的话题,不过现在也该到冷静下来进行思考的时候了,真正的开源公司已经利用开源赚得盆满钵盈。

  • 何时是创建门户应用最佳时机

    在创建出新企业门户应用,链接到现有系统之前,你可能需要检查一下这些系统,确保这些系统本身不需要重造。这样你可能就会重新考虑是否要创建新企业门户应用了。

  • 优化Jboss EAP平台的12项最佳实践

    在过去几年里,NBC环球电影公司的Web架构团队牺牲了可观的时间和资源去改善其高度分布的企业架构。Richir Choudhry、Alpesh Vaghela……

  • 开源PaaS技术手册

    开源业界向来不太平,关于诸多技术的开源未来足以让很多粉丝兴奋躁动起来。商业软件开始揉进开源技术,开源技术也成为IT大佬们得基础架构,这一种趋势蔓延的缓慢有有力。在广告漫天飞得云计算中,开源的分量有多重?是否走向云端就意味着走向开源?开源的PaaS如何选择?如何为开源项目选择PaaS厂商?哪些服务平台值得我们关注,下面我们一一来揭晓。