1、在Jboss环境下Web Service调用EJB本文描述了如何在Jboss环境下Web Service调用EJB.作者用实例代码一步一步详细描述了整个过程.既然是实战,讲究的是实用性,所以关于Jboss、Web Service和EJB的入门介绍这里就免去了,请自行查阅相关资料。好,实战正式开始!一.开发环境:1. Java SDK1.42. Eclipse3.0中文版3. Jboss3.2应用服务器4. Windows 2000中文专业版二.环境变量的设置:以下是我自己机器的环境变量设置,如果是linux系统,设置有所不同:ANT_HOME=C:antJAVA_HOME=C:j2sdkJBO
2、SS_HOME=C:jboss最后在系统变量的path变量中追加C:jbossbin;三.会话Bean的编写:在EJB中,会话BEAN需要实现一个远程接口和一个本地接口,那我们就先实现这个两个接口:1.远程接口:我们实现的是一个人员管理的用例,这个用例包含3个方法,代码如下:4.数据模型类:会话BEAN中使用到了一个Person类,该类是一个数据模型,用于数据的封装。实现上和普通的Javabean值对象没有什么区别,不过为了在网络间传递,值对象必须实现序列化接口java.io. Serializable接口,这是个空接口,仅作为标志类型,没有需要实现的方法,代码如下:import java.i
3、o.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
4、+ 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
5、 Service的配置文件利用ant我们可以很方便的自动生成EJB和Web Service的配置文件,省去了手工编写的麻烦。Ant的build.xml文件代码如下: 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.RemoteE
6、xception; 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对象参数,往
7、人员集合中存储一个人员对象;(3) deletePerson方法,根据一个人员的姓名从人员集合中删除一个人员对象由于是远程接口,所以每个方法必须抛出RemoteException异常。2.本地HOME接口的实现:为了提高EJB的性能,如果是在同一个虚拟机中,EJB可以通过本地接口来调用方法,以提高运行速度。实现代码如下:/* * Generated by XDoclet - Do not edit! */package com.ejb.sessionbean;/* * Home interface for PersonManager. */public interface PersonMana
8、gerHome 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接口只有一个方法,
9、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;i
10、mport 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 Pers
11、onManagerBean 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, Remo
12、teException / 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
13、) 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
14、= remote * param name */ public void deletePerson( String name ) if (database != null) database.remove(name); 在运行ant之前还必须做2件事情:1.到$JBOSS_HOMEserveralllib目录下将jboss-j2ee.jar文件复制到当前项目的lib目录下,如果没有lib目录,自己创建一个。2.将$ECLIPSE_HOMEpluginsorg.jboss.ide.eclipse.xdoclet.core_1.4.1目录下的所有jar文档也复制到当前项目的lib目录中。注:这个目
15、录只有安装了Jboss-IDE插件之后才会有。运行ant命令,如果顺利完成,会在当前项目的build/PersonManagerService/META-INF目录下产生3文xml文件:ejb-jar.xml、jboss.xml和web-service.xml五.利用Jboss-IDE插件部署发布EJB和Web Service1.Jboss-IDE插件的下载和安装Jboss-IDE是Jboss推荐的一个辅助J2EE开发的Eclipse插件,可以去2.利用Jboss-IDE打包EJB切换到java透视图模式下,然后在项目名称上点击右键,在出现的右键菜单上选择属性,在出现的窗口中选择Packagi
16、ng Configuration选项,出现如下的窗口以上是设置完成之后的最终窗口,如果没有设置,请点击add按钮,出现如下窗口在name框中输入打包jar文档的名称,我们可以输入PersonManager.jar,在Destination中点击Browse按钮,选择当前项目中的bulid目录,这个选项是指定jar文件的输出目录,如果当前项目中没有build目录,请自己创建一个。完成之后点击确定完成;PersonManager.jar选项上点击右键,在出现的右键菜单上选择Add Folder选项,出现以下窗口在Folder输入框中选择会话bean的class文件,如:/WebService/bi
17、n/com/ejb/sessionbean,在Includes输入框中输入*.class,表示将该目录下的所有class文件进行打包,在perfix中输入class文件的打包路径,如:com/ejb/sessionbean,这个路径必须和类中的package的设置一样,然后点击确定完成。用同样的方法再创建一个class目录,就是Person对象。完成之后如下图:点击确定完成;接下去是指定2个打包用的EJB的配置文件,在PersonManager.jar选项上点击右键,在出现的右键菜单上选择Add File选项,出现以下窗口在File输入框中选择ejb-jar.xml文件的路径,在Perfix框
18、中输入META-INF,表示该配置文件将被打包到META-INF目录中。用相同的方法将另外一个配置文件jboss.xml也打包进来,如下图完成之后,就完成了EJB部分的打包设置。接下来是Web Service的打包设置,Web Service很简单,只要将web-service.xml配置文件打包成wsr文件就可以了,点击add按钮,输入打包名称,选择输出目录,点击确定,如下图在PersonManagerService.wsr选项上点击右键,在出现的右键菜单上选择Add File选项出现如下窗口在File输入框中选择web-service.xml配置文件的路径,在Prefix输入框中输入MET
19、A-INF,表示配置文件将被打包到META-INF目录中。点击确定完成。到此所有的打包配置工作全部完成。完成之后会在项目的根目录下产生一个packaging-build.xml文件,其实它是一个ant的build文件,有兴趣的可以打开看看。可以学到不少东西。接下去是运行ant,进行打包,在项目名称上点击右键,在出现的右键菜单上点击Run Packing选项,如下图如果运行成功,则会去build目录下产生2个文件,PersonManager.jar和PersonManagerService.wsr文件,前一个是EJB打包文件,第2个是Web Service打包文件。如下图所示3.EJB和Web
20、Service的部署与发布在PersonManager.jar文件上点击右键,在出现的右键菜单上选择Deployment-Deploy to选项,将EJB发布到jboss服务器中,如下如所示用同样的方法部署发布PersonManagerService.wsr文件,完成EJB和Web Service的发布部署。需要注意的是,通过上面的方法发布应用程序,需要在Eclipse中设置Jboss服务器的安装路径,相关设置请查阅Jboss-IDE的使用说明。另外的一个发布方法,是利用Jboss的热部署特性,直接将PersonManager.jar和PersonManagerService.wsr这2个文件
21、直接复制到$JBOSS_HOME serveralldeploy目录下即可。由于Jboss3.2只有在all模式下才包含Web Service的支持,所以一定要复制到all目录中的deploy目录下。至此所有的开发部署已经完成!六.测试Jboss的服务是否已经成功发布要测试服务已经成功启动,请使用以下方法1.启动jboss服务器,注意启动服务器需要带all参数,如下如所示启动成功之后的画面如下在红色线框中我们已经可以看到EJB(PersonManager.jar)已经部署成功了。2.检查Web Service是否已经启动。打开浏览器,输入http:/localhost:8080/jboss-n
22、et/servlet/AxisServlet,出现如下的页面:从中我们发现PersonManagerService这个服务已经启动了。包含getPersonByName,getPersonList,storePerson和deletePerson方法,注:其中getPersonList方法应该是没有的,因为在该篇文章中我们并没有在会话bean的实现类中实现这个方法,也没有在远程接口中定义这个方法。到此我们已经测试完成了,并证明EJB和Web Service都已经成功的发布或启动了。七.编写客户端进行测试我们使用application的方式编写一个客户端程序对刚才发布的EJB和Web Servi
23、ce进行测试。代码如下:package com.webservice.client;import .*;import javax.xml.namespace.*;import javax.xml.rpc.ParameterMode;import org.apache.axis.client.*;import org.apache.axis.encoding.*;import org.apache.axis.encoding.ser.BeanSerializerFactory;import org.apache.axis.encoding.ser.BeanDeserializerFactory;
24、import com.pojo.*;public class PersonManagerClinet public static void main( String args ) throws Exception String endpoint = http:/localhost:8080/jboss-net/services/PersonManagerService; Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new URL(e
25、ndpoint); QName qn = new QName(http:/localhost:8080/pojo/person, Person); call.registerTypeMapping(Person.class, qn, new BeanSerializerFactory( Person.class, qn), new BeanDeserializerFactory(Person.class, qn); Person person = null; call.setOperationName(storePerson); call.addParameter(person, XMLTyp
26、e.XSD_ENTITY, ParameterMode.IN); person = new Person(java); call.invoke(new Object person); System.out.println(OK!); call.setOperationName(getPersonByName); call.addParameter(name, XMLType.XSD_STRING, ParameterMode.IN); call.setReturnType(qn); person = (Person) call.invoke(new Object java); System.out.println(person); 运行结果如下:可以看到服务已经运行了,并返回了正确的结果。到此我们已经完成了在Jboss环境下Web Service调用EJB的开发,另外jboss自从4.0开始升级了其Web Service模块,由原来的jboss-net升级到了ws4ee,而且部署和发布也发生很大的变化,可以说,在3.2下的调试成功的Web Service在
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1