在Jboss环境下Web Service调用EJBWord文档格式.docx
《在Jboss环境下Web Service调用EJBWord文档格式.docx》由会员分享,可在线阅读,更多相关《在Jboss环境下Web Service调用EJBWord文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
*/
publicclassPerson
implementsSerializable
{
privateStringname;
publicPerson()
{
this.name="
unknow"
;
}
publicPerson(Stringname)
this.name=name;
publicStringtoString()
StringBuffersb=newStringBuffer();
sb.append("
name="
+this.name+"
\n"
);
returnsb.toString();
/**
*@return返回name。
publicStringgetName()
returnname;
*@paramname
*要设置的name。
publicvoidsetName(Stringname)
}
另外,在PersonManagerBean和Person类中都使用了xdoclet标志,这个是为了能通过jbossIDE插件来产生ant的build文件,然后自动生成EJB的配置文件和WebService的配置文件。
四.使用ant产生EJB和WebService的配置文件
利用ant我们可以很方便的自动生成EJB和WebService的配置文件,省去了手工编写的麻烦。
Ant的build.xml文件代码如下:
<
?
xmlversion="
1.0"
encoding="
GB2312"
>
projectname="
PersonManager"
basedir="
."
default="
xdoclet"
<
propertyenvironment="
evn"
/>
propertyname="
generated.dir"
location="
src"
pathid="
xdoclet.classpath"
filesetdir="
lib"
includename="
**/*.jar"
/fileset>
pathelementlocation="
bin"
/path>
targetname="
taskdefclasspathref="
classname="
xdoclet.modules.ejb.EjbDocletTask"
name="
ejbdoclet"
ejbdocletejbSpec="
2.0"
destDir="
homeinterface/>
remoteinterface/>
jbossVersion="
3.2"
build/PersonManagerService/META-INF"
deploymentdescriptordestDir="
includes="
com/ejb/sessionbean/*.java,com/pojo/*.java"
jbossnetxmlencoding="
UTF-8"
destdir="
webDeploymentName="
PersonManagerService"
targetNameSpace="
http:
//localhost:
8080/pojo/person"
prefix="
person"
/ejbdoclet>
/target>
/project>
packagecom.ejb.sessionbean;
*RemoteinterfaceforPersonManager.
publicinterfacePersonManager
extendsjavax.ejb.EJBObject
publiccom.pojo.PersongetPersonByName(java.lang.Stringname)
throwsjava.rmi.RemoteException;
publicvoidstorePerson(com.pojo.Personperson)
publicvoiddeletePerson(java.lang.Stringname)
PersonManager接口实现的是EJB的远程接口EJBObject,包含3个方法,描述如下:
(1)getPersonByName方法:
通过人员的姓名返回一个Person对象;
(2)storePerson方法,通过一个Person对象参数,往人员集合中存储一个人员对象;
(3)deletePerson方法,根据一个人员的姓名从人员集合中删除一个人员对象
由于是远程接口,所以每个方法必须抛出RemoteException异常。
2.本地HOME接口的实现:
为了提高EJB的性能,如果是在同一个虚拟机中,EJB可以通过本地接口来调用方法,以提高运行速度。
实现代码如下:
/*
*GeneratedbyXDoclet-Donotedit!
*HomeinterfaceforPersonManager.
publicinterfacePersonManagerHome
extendsjavax.ejb.EJBHome
publicstaticfinalStringCOMP_NAME="
java:
comp/env/ejb/PersonManager"
publicstaticfinalStringJNDI_NAME="
PersonManagerHomeRemote"
publiccom.ejb.sessionbean.PersonManagercreate()
throwsjavax.ejb.CreateException,java.rmi.RemoteException;
PersonManagerHome接口只有一个方法,create方法,它与会话bean的具体实现类中ejbCeate方法一一对应。
3.具体实现类:
PersonManagerBean是会话BEAN的具体实现类,必须实现SessionBean接口,而且同时实现了在远程接口中定义的相关业务逻辑方法,具体实现代码如下
importjava.rmi.RemoteException;
importjava.util.*;
importjavax.ejb.EJBException;
importjavax.ejb.SessionBean;
importjavax.ejb.SessionContext;
importcom.pojo.*;
*@ejb.beandescription="
PersonManagerBean"
display-name=
*"
jndi-name="
*name="
type="
Stateless"
view-type="
remote"
*transaction-type="
Container"
*@jboss-net.web-serviceurn="
expose-all="
true"
publicclassPersonManagerBean
implementsSessionBean
privateSessionContextctx;
privatestaticMapdatabase;
*@ejb.create-method
*
publicvoidejbCreate()
publicvoidsetSessionContext(SessionContextctx)throwsEJBException,
RemoteException
//TODO自动生成方法存根
publicvoidejbRemove()throwsEJBException,RemoteException
publicvoidejbActivate()throwsEJBException,RemoteException
publicvoidejbPassivate()throwsEJBException,RemoteException
*@ejb.interface-methodview-type="
*@return
publicPersongetPersonByName(Stringname)
if(database!
=null)
return(Person)database.get(name);
returnnull;
*@paramperson
publicvoidstorePerson(Personperson)
if(database==null)
database=newHashMap();
database.put(person.getName(),person);
publicvoiddeletePerson(Stringname)
database.remove(name);
在运行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
五.利用Jboss-IDE插件部署发布EJB和WebService
1.Jboss-IDE插件的下载和安装
Jboss-IDE是Jboss推荐的一个辅助J2EE开发的Eclipse插件,可以去
2.利用Jboss-IDE打包EJB
切换到java透视图模式下,然后在项目名称上点击右键,在出现的右键菜单上选择属性,在出现的窗口中选择PackagingConfiguration选项,出现如下的窗口
以上是设置完成之后的最终窗口,如果没有设置,请点击add…按钮,出现如下窗口
在name框中输入打包jar文档的名称,我们可以输入PersonManager.jar,在Destination中点击Browse按钮,选择当前项目中的bulid目录,这个选项是指定jar文件的输出目录,如果当前项目中没有build目录,请自己创建一个。
完成之后点击确定完成;
PersonManager.jar选项上点击右键,在出现的右键菜单上选择AddFolder选项,出现以下窗口
在Folder输入框中选择会话bean的class文件,如:
/WebService/bin/com/ejb/sessionbean,在Includes输入框中输入*.class,表示将该目录下的所有class文件进行打包,在perfix中输入class文件的打包路径,如:
com/ejb/sessionbean,这个路径必须和类中的package的设置一样,然后点击确定完成。
用同样的方法再创建一个class目录,就是Person对象。
完成之后如下图:
点击确定完成;
接下去是指定2个打包用的EJB的配置文件,在PersonManager.jar选项上点击右键,在出现的右键菜单上选择AddFile选项,出现以下窗口
在File输入框中选择ejb-jar.xml文件的路径,在Perfix框中输入META-INF,表示该配置文件将被打包到META-INF目录中。
用相同的方法将另外一个配置文件jboss.xml也打包进来,如下图
完成之后,就完成了EJB部分的打包设置。
接下来是WebService的打包设置,WebService很简单,只要将web-service.xml配置文件打包成wsr文件就可以了,点击add按钮,输入打包名称,选择输出目录,点击确定,如下图
在PersonManagerService.wsr选项上点击右键,在出现的右键菜单上选择AddFile选项出现如下窗口
在File输入框中选择web-service.xml配置文件的路径,在Prefix输入框中输入META-INF,表示配置文件将被打包到META-INF目录中。
点击确定完成。
到此所有的打包配置工作全部完成。
完成之后会在项目的根目录下产生一个packaging-build.xml文件,其实它是一个ant的build文件,有兴趣的可以打开看看。
可以学到不少东西。
接下去是运行ant,进行打包,在项目名称上点击右键,在出现的右键菜单上点击RunPacking选项,如下图
如果运行成功,则会去build目录下产生2个文件,PersonManager.jar和PersonManagerService.wsr文件,前一个是EJB打包文件,第2个是WebService打包文件。
如下图所示
3.EJB和WebService的部署与发布
在PersonManager.jar文件上点击右键,在出现的右键菜单上选择Deployment->
Deployto选项,将EJB发布到jboss服务器中,如下如所示
用同样的方法部署发布PersonManagerService.wsr文件,完成EJB和WebService的发布部署。
需要注意的是,通过上面的方法发布应用程序,需要在Eclipse中设置Jboss服务器的安装路径,相关设置请查阅Jboss-IDE的使用说明。
另外的一个发布方法,是利用Jboss的热部署特性,直接将PersonManager.jar和PersonManagerService.wsr这2个文件直接复制到${JBOSS_HOME}\server\all\deploy目录下即可。
由于Jboss3.2只有在all模式下才包含WebService的支持,所以一定要复制到all目录中的deploy目录下。
至此所有的开发部署已经完成!
六.测试Jboss的服务是否已经成功发布
要测试服务已经成功启动,请使用以下方法
1.启动jboss服务器,注意启动服务器需要带all参数,如下如所示
启动成功之后的画面如下
在红色线框中我们已经可以看到EJB(PersonManager.jar)已经部署成功了。
2.检查WebService是否已经启动。
打开浏览器,输入http:
8080/jboss-net/servlet/AxisServlet,出现如下的页面:
从中我们发现PersonManagerService这个服务已经启动了。
包含getPersonByName,getPersonList,storePerson和deletePerson方法,注:
其中getPersonList方法应该是没有的,因为在该篇文章中我们并没有在会话bean的实现类中实现这个方法,也没有在远程接口中定义这个方法。
到此我们已经测试完成了,并证明EJB和WebService都已经成功的发布或启动了。
七.编写客户端进行测试
我们使用application的方式编写一个客户端程序对刚才发布的EJB和WebService进行测试。
代码如下:
packagecom.webservice.client;
import.*;
importjavax.xml.namespace.*;
importjavax.xml.rpc.ParameterMode;
importorg.apache.axis.client.*;
importorg.apache.axis.encoding.*;
importorg.apache.axis.encoding.ser.BeanSerializerFactory;
importorg.apache.axis.encoding.ser.BeanDeserializerFactory;
publicclassPersonManagerClinet
publicstaticvoidmain(Stringargs[])throwsException
Stringendpoint="
8080/jboss-net/services/PersonManagerService"
Serviceservice=newService();
Callcall=(Call)service.createCall();
call.setTargetEndpointAddress(newURL(endpoint));
QNameqn=newQName("
"
call.registerTypeMapping(Person.class,qn,newBeanSerializerFactory(
Person.class,qn),
newBeanDeserializerFactory(Person.class,qn));
Personperson=null;
call.setOperationName("
storePerson"
call.addParameter("
XMLType.XSD_ENTITY,ParameterMode.IN);
person=newPerson("
java"
call.invoke(newObject[]{person});
System.out.println("
OK!
"
getPersonByName"
name"
XMLType.XSD_STRING,ParameterMode.IN);
call.setReturnType(qn);
person=(Person)call.invoke(newObject[]{"
});
System.out.println(person);
运行结果如下:
可以看到服务已经运行了,并返回了正确的结果。
到此我们已经完成了在Jboss环境下WebService调用EJB的开发,另外jboss自从4.0开始升级了其WebService模块,由原来的jboss-net升级到了ws4ee,而且部署和发布也发生很大的变化,可以说,在3.2下的调试成功的WebService在