当前位置: 代码迷 >> Web前端 >> 基于Axis2的web服务的开发、支配和客户端调用
  详细解决方案

基于Axis2的web服务的开发、支配和客户端调用

热度:134   发布时间:2012-10-24 14:15:58.0
基于Axis2的web服务的开发、部署和客户端调用
通过Axis2(版本1.4.1)与Tomcat(5.5.27)的结合,Axis2在Tomcat的webapps目录下,只要将满足一定目录结构的web服务的相关文件拷贝到axis2\WEB-INF\services目录下,便可以完成该服务的部署。
? 要部署的服务的目录结构必须满足下面的结构
? - MyService
?? - META-INF
???? - services.xml
?? - lib
???? - log4j.jar?
?? - edu
???? - nwpu
?????? - service
???????? - test
?????????? - AddService.class
?? 其中最重要的是META-INF目录下的services.xml文件,axis2通过该文件来获知该服务的名称、服务类型以及服务类。下面是一个简单的services.xml
?? <service name="AddService" scope="application">
??? <description>
??????? Addition POJO Service
??? </description>
??? <messageReceivers>
??<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
???????????????????????? class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
??????? <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
???????class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
??? </messageReceivers>
??? <parameter name="ServiceClass">
??????? edu.nwpu.hpc.cssp.wsmaker.service.AddService
??? </parameter>
?</service>
?
?其首先定义了name,该名称就是Axis2唯一标识该服务的名字。还定义了服务接口类型,是in-only还是in-out,不同类型对应了不同的class再就是定义了ServiceClass,也就是具体该服务的提供类,要该类的全路径名称来标识。
通过上面的对于Axis2部署service的方法,可以知道,部署一个服务只需要将该服务的所有相关Java文件,包括class文件、jar文件按照axis2所要求的方式组织,然后再就是修改servicex.xml文件,让其与该服务的实际情况相吻合,然后再将这个文件夹拷贝到tomcat的axis2的相关目录下就可以了。
编写web服务的客户端调用程序
使用RPC的方式来进行客户端程序编写需要导入的包有:
???? import javax.xml.namespace.QName;
?import org.apache.axis2.AxisFault;
?import org.apache.axis2.addressing.EndpointReference;
?import org.apache.axis2.client.Options;
?import org.apache.axis2.rpc.client.RPCServiceClient;
主要功能代码如下:
?RPCServiceClient serviceClient = new RPCServiceClient();
??????? Options options = serviceClient.getOptions();
//这一步指定了该服务的提供地址
??????? EndpointReference targetEPR = new EndpointReference(
??????????????? "http://localhost:8080/axis2/services/AddService");
//将option绑定到该服务地址???????????????
??????? options.setTo(targetEPR);
??????? // 添加具体要调用的方法,这个可以从该服务的wsdl文件中得知
??????? // 第一个参数是该服务的targetNamespace,第二个为你所要调用
??????? // 的operation名称
???????
??????? QName opAdd =
??????????? new QName("http://service.wsmaker.cssp.hpc.nwpu.edu", "add");
???????
??????? //设置返回值类型
??????? Class[] returnTypes = new Class[] {Integer.class};
??????? //设置调用的参数
??????? Object[] opAddArgs = new Object[] {2, 3};
??????? //调用服务,获得返回值
??????? Object[] response = serviceClient.invokeBlocking(opAdd, opAddArgs, returnTypes);
???????
???????
??????? Integer res = (Integer)response[0];
??????? if (res == null) {
??????? ?System.out.println("wrong");
??????? ?return;
??????? }
??????? System.out.println(res);
? 注意:应该包含所有axis2_home\lib下的jar文件
?
这样便可以完成一个简单的加法服务的开发,部署和调用。在这里我使用的是Axis2的POJO的方式来部署,Axis2的官方网站上提供了多种创建服务的方式(参考 http://ws.apache.org/axis2/1_4_1/quickstartguide.html),POJO方式的局限就是无法支持初始化配置,也就是你部署的服务的初始值无法在部署一开始就设定,必须通过客户端调用的方式来设定,但是在一般情况下,这种方式可以满足大部分需求的。
1 楼 wgs7909 2009-07-04  
AXIS2的学习有了很大的进步,刚才碰到了一个问题,解决不了了。
问题:把CLASS部署到POJO下,如果此类中引用了别的类,就找不到了。应该把被引用的类放在哪儿?可以加我的QQ:87356667,也可以MSN:WGS7909@HOTMAIL。COM
2 楼 kungstriving 2009-07-05  
wgs7909 写道
AXIS2的学习有了很大的进步,刚才碰到了一个问题,解决不了了。
问题:把CLASS部署到POJO下,如果此类中引用了别的类,就找不到了。应该把被引用的类放在哪儿?可以加我的QQ:87356667,也可以MSN:WGS7909@HOTMAIL。COM

如果是引用类文件,直接按照正确的包结构放置在AXIS2_HOME下的services目录下即可;
如果是引用jar文件,我的做法是放到AXIS2_HOME下的/lib文件夹下
3 楼 jun_fx 2009-07-28  
你好! 我现在要将<soapenv:Envelope>转成 <soap:Body>(.net写的) 。 目的是为了兼容以前的系统。
我现在的问题是:
  1. 能不能转,如何转?
   2. 我是才入职的员工,在这样的公司是否可以发展?(公司无文档。。。。)
 
4 楼 kungstriving 2009-07-29  
jun_fx 写道
你好! 我现在要将<soapenv:Envelope>转成 <soap:Body>(.net写的) 。 目的是为了兼容以前的系统。
我现在的问题是:
  1. 能不能转,如何转?
   2. 我是才入职的员工,在这样的公司是否可以发展?(公司无文档。。。。)
 


我们做的也没有涉及到你的第一个问题,所以无法回答你的问题。但随后,我们项目肯定会做截获SOAP消息的工作,具体怎么做以后再讨论
我还没有入职,呵呵,所以第二个问题我也无法回答你的
5 楼 michael.softtech 2009-07-31  
现在这种例子已经很多了....
楼主看能不能把安全验证部分一同贴出来吧哈哈
6 楼 luck_dream 2009-08-10  
如在要在MyEclipse7.0上新建一项目,并使用axis2,这一切该如何解决呢?望能有详细点的步骤,感谢。
7 楼 kungstriving 2009-08-12  
luck_dream 写道
如在要在MyEclipse7.0上新建一项目,并使用axis2,这一切该如何解决呢?望能有详细点的步骤,感谢。


你说的使用axis2主要指做什么啊,生成客户端调用还是做一个soap容器?
首先,新建项目后需要导入axis2所需要的所有包,如果要生成客户端,那么可以根据axis2官方网站上的说法使用wsdl2java工具生成。如果要做一个soap消息的接收容器,则需要在你的程序中通过servlet容器的方式启动axis2server。要做第二步需要对axis2的源码有一定的了解
8 楼 danni505 2009-08-12  
综上可得:没有入职懂得比在职的多!
  相关解决方案