当前位置: 代码迷 >> Web前端 >> 使用Apache Axis2 实现Webservice发布
  详细解决方案

使用Apache Axis2 实现Webservice发布

热度:983   发布时间:2012-10-24 14:15:58.0
应用Apache Axis2 实现Webservice发布

应用Apache Axis2 实现Webservice发布



由于最近需要做webservice接口,所以google了一下,发现Apacle有个Axis2插件,一直觉得Apache的插件还是蛮好用的,于是决定应用Axis2来实现Webservice,第一次做webservice,呵呵有很多不懂的地方,所以记录下来留着以后备用。

首先访问Apache官网http://axis.apache.org/axis2/java/core/download.cgi下载Axis2最新的1.6.2的两个文件,axis2-1.6.2-bin和axis2-1.6.2-war,我这里用到了axis2的eclipse插件,所以同时下载了?axis2-eclipse-codegen-plugin-1.6.2.zip和axis2-eclipse-service-plugin-1.6.2.zip两个eclipse插件。

下载完这几个文件之后,需要将axis2的war文件复制到tomcat的wabapps目录下,重启Tomcat服务,浏览器输入axis2服务地址http://localhost:8082/axis2/,如果axis2服务没有问题,页面会显示如下效果,说明服务启动成功。

接下来在Eclipse中安装axis2插件,将下载的axis2-eclipse-codegen-plugin-1.6.2.zip和axis2-eclipse-service-plugin-1.6.2.zip文件解压,解压出来就是2个jar包,

将这两文件复制到Ecilpse的 plugins文件夹下,重启Eclipse,配置axis2的运行环境,如图,图中的路径F:\axis2-1.6.2就是下载的axis2-1.6.2-bin的解压目录。



点击file->new others->,如果插件安装成功,在窗口的列表中会显示如下的axis2的两个选项,



做好以上准备工作之后,接下来就要开始创建Webservice了。首先创建一个java工程,并创建一个Java类,很简单的一个类,只包含一个公共方法,如下

?

[java]?view plaincopyprint?
  1. package?com.jax.test;??
  2. ??
  3. import?com.jax.db.DataBase;??
  4. ??
  5. public?class?TestService?{??
  6. ??
  7. ????public?String?getData(String?id,String?name){??
  8. ????????return?DataBase.getData(id,name);?????????
  9. ????}??
  10. ??????
  11. }??

在服务类TestService中,有一个getData方法,最后发布服务之后,该方法就是暴露给外界访问webservice接口的方法。包含2个String参数和一个返回值,在方法中,

通过DataBase类的getData方法访问了Oracle数据库并返回数据。

?

编写完服务类之后,通过axis2的插件将服务打包成aar文件,复制到tomcat的webapps的axis2目录下的WEB-INF下的services文件夹下,打包过程如下

点击file->new others-> 在窗口中选择Axis2 Service Archiver选项,然后下一步如图,该步骤是选择class类的根目录,在bin目录下,包含了2个Class类文件,

com.jax.test.TestService和com.jax.db.DataBase,因为在TestService服务类中,关联了DataBase类,所以要选择根目录。



点击next ->如图所示 勾选Skip WSDL


?

点击next->选择服务所需的jar包,在这里因为连接了oracle数据库,所以选择了orache的驱动包

?

点击next-> 如图,勾选 图中的选项。


点击next-> 如图,输入服务名和服务类的全路径名,选择Search declare methods only,会显示要发布的服务方法。

输入打包aar文件的名称和输出路径,最后打包完成。





最后将打包好的aar文件复制到tomcat 的axis2的WEB-INF的services目录下,重启Tomcat服务,如图,发布的MyService服务



这样一个简单的webservice服务就发布完成了,有一点需要注意的是,和这个服务类相关的类需要打成jar包拷贝到axis服务的WEB-INF的lib目录下。




用Axis2创建调用webservice的客户端,创建java工程,引入以下axis2相关的jar包

?

axiom-api-1.2.11.jar
axiom-impl-1.2.11.jar
axis2-adb-1.5.5.jar
axis2-kernel-1.5.5.jar
axis2-transport-http-1.5.5.jar
axis2-transport-local-1.5.5.jar

commons-codec-1.3.jar
commons-httpclient-3.1.jar
commons-io.jar
commons-logging-1.1.1.jar
httpcore-4.0.jar
mail-1.4.jar
neethi-2.0.5.jar
wsdl4j-1.6.2.jar
XmlSchema-1.4.3.jar


创建调用服务类,应用axis2提供的类实现调用服务,代码如下:

[java]?view plaincopyprint?
  1. package?com.test;??
  2. ??
  3. import?java.util.Iterator;???
  4. import?javax.xml.namespace.QName;???
  5. import?org.apache.axiom.om.OMAttribute;???
  6. import?org.apache.axiom.om.OMElement;???
  7. import?org.apache.axis2.AxisFault;???
  8. import?org.apache.axis2.addressing.EndpointReference;???
  9. import?org.apache.axis2.client.Options;???
  10. import?org.apache.axis2.rpc.client.RPCServiceClient;???
  11. ??
  12. public?class?CallWebservice?{???
  13. ??
  14. public?String?getData(String?id,String?name)?{???
  15. ????String?result=null;???
  16. ??????????
  17. ????//webService的调用地址?????
  18. ????String?srvcUrl?=?"http://localhost:8082/axis2/services/MyService";???
  19. ????//操作的命名空间+“:”+操作名???
  20. ????QName?qname?=?new?QName("http://test.jax.com",?"getData");???
  21. ????//传递的参数对象集??
  22. ????Object?param[]?=?new?Object[]?{?id,name?};???
  23. ????try?{???
  24. ????????//实例化远程服务调用客户端对象???
  25. ????????RPCServiceClient?client?=?new?RPCServiceClient();???
  26. ????????//实例化Options对象??
  27. ????????Options?options?=?new?Options();???
  28. ????????//设置Options对象的连接终端地址??
  29. ????????options.setTo(new?EndpointReference(srvcUrl));???
  30. ????????//设置Options对象的操作事件对象???
  31. ????????options.setAction("urn:getData");???
  32. ????????//为远程服务调用客户端对象设置Options子对象???
  33. ????????client.setOptions(options);???
  34. ????????//传递参数,调用服务??
  35. ?????????OMElement?element?=?client.invokeBlocking(qname,?param);???
  36. ??????????
  37. ????????result=element.getFirstElement()?.getText();???
  38. ??????
  39. ????}???
  40. ????catch?(AxisFault?e)?{???
  41. ????????e.printStackTrace();???
  42. ????}???
  43. ????return?result;???
  44. }???
  45. ??
  46. //测试???
  47. public?static?void?main(String[]?args)?{???
  48. ??
  49. ????CallWebservice?client=new?CallWebservice();???
  50. ??????
  51. ????String?rs?=?client.getData("1","张三");???
  52. ?????System.out.println(rs);???
  53. }???
  54. }???


代码说明请看注释。

?


还有一种调用方式是通过axis2工具生成stub类,然后调用webservice,


打开cmd命令窗口,进入axis2的bin目录,输入命令:wsdl2java -urihttp://localhost:8082/axis2/services/MyService?wsdl?-p client -s -o stub

如图


?其中-url参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录。在执行完上面的命令后,读者就会发现在当前目录下多了个stub目录,在."stub"src"client目录可以找到一个MyServiceStub.java文件,该文件复杂调用WebService,然后可以在程序中直接使用这个类,通过stub调用webservice 代码如下:

?

[java]?view plaincopyprint?
  1. package?client;??
  2. ??
  3. import?java.rmi.RemoteException;??
  4. ??
  5. import?org.apache.axis2.AxisFault;??
  6. ??
  7. import?client.MyServiceStub.GetDataResponse;??
  8. ??
  9. public?class?CallService?{??
  10. ??
  11. ????public?static?void?main(String[]?args){??
  12. ????????//MyServiceStub中生成了一个getData(GetData?getData)的方法??
  13. ????????//该方法的内部实现了调用发布的webservice服务中的getData()方法??
  14. ??????????
  15. ????????//首先创建参数对象??
  16. ????????MyServiceStub.GetData?getData?=?new?MyServiceStub.GetData();??
  17. ????????//给参数赋值??
  18. ????????getData.setId("1");??
  19. ????????getData.setName("张三");??
  20. ??????????
  21. ????????try?{??
  22. ????????????//实例化stub类??
  23. ????????????MyServiceStub?stub?=?new?MyServiceStub();??
  24. ????????????try?{??
  25. ????????????????//调用服务方法??
  26. ????????????????GetDataResponse?rs?=?stub.getData(getData);??
  27. ????????????????//返回值为String???
  28. ????????????????String?str?=?rs.get_return();??
  29. ????????????????System.out.println(str);??
  30. ????????????}?catch?(RemoteException?e)?{??
  31. ????????????????//?TODO?Auto-generated?catch?block??
  32. ????????????????e.printStackTrace();??
  33. ????????????}??
  34. ????????}?catch?(AxisFault?e)?{??
  35. ????????????//?TODO?Auto-generated?catch?block??
  36. ????????????e.printStackTrace();??
  37. ????????}??
  38. ????}??
  39. }??
  相关解决方案