服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

在jboss下webservice调用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:/jboss/bin;
  
  三.会话bean的编写:
  
  在ejb中,会话bean需要实现一个远程接口和一个本地接口,那我们就先实现这个两个接口:
  
  1.远程接口:
  
  我们实现的是一个人员管理的用例,这个用例包含3个方法,代码如下:
  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);
  }
  }}
  
  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>
  
  在运行ant之前还必须做2件事情:
  
  1.到${jboss_home}/server/all/lib目录下将jboss-j2ee.jar文件复制到当前项目的lib目录下,如果没有lib目录,自己创建一个。
  
  2.将${eclipse_home}/plugins/org.jboss.ide.eclipse.xdoclet.core_1.4.1目录下的所有jar文档也复制到当前项目的lib目录中。注:这个目录只有安装了jboss-ide插件之后才会有。
  
  运行ant命令,如果顺利完成,会在当前项目的build/personmanagerservice/meta-inf目录下产生3文xml文件:ejb-jar.xml、jboss.xml和web-service.xml

扫描关注微信公众号