使用Axis2开发webservice服务端接口+axis开发的客户端调用

之前用了cxf框架开发了服务端。为了区别二者的特点,区分了解。今天用axis2框架开发服务端。这里感谢博主javawebsoa的文章:用AXIS2发布WebService的方法。这里自己在记录一下自己的开发思路。

环境:
jdk:发现要求不高。1.5及以上版本都可以。
tomcat:tomcat7.0.72
axis2+web+tomcat

1.下载jar包

点击 axis2官网 进入下载页面如下图,我们只需要下载war.zip这个就够用了。

使用Axis2开发webservice服务端接口+axis开发的客户端调用_第1张图片

进入下载页面,下载点击图示链接即可完成下载。
使用Axis2开发webservice服务端接口+axis开发的客户端调用_第2张图片

2.小试牛刀。

下载完后解压,把axis2.war拷贝至tomcat安装目录下的webapps文件夹下,启动tomcat后,在webapps目录下会生成axis2文件夹。 访问http://localhost:8080/axis2/能看到以下页面表示axis2运行成功。如下图

使用Axis2开发webservice服务端接口+axis开发的客户端调用_第3张图片

3.奔跑的java代码

在Eclipse下新建Web Project,工程名:webServe。新建包com.cm.service,新建类HelloWorld,代码如下:

package com.cm.service;

public class HelloWorld {

    public String sayHello(String name){return "Hello, "+name+".";}
    public String saySorry(String name){return "Sorry,"+name+".";}
    public String getWorld(){return "Hello,World";}

}

4.在web.xml中注册org.apache.axis2.transport.http.AxisServlet

具体为什么要注册,我看了官方文档,解释是这个:

The servlet transport processes HTTP requests received through the servlet container in which Axis2 is deployed. It is different from the other transports because its lifecycle is not managed by Axis2, but by the servlet container. Two things are necessary to enable and configure the servlet transport:
org.apache.axis2.transport.http.AxisServlet must be registered and mapped as a servlet in web.xml.

大致是说AxisServlet 的http请求的传输需经过servlet容器,而这容器也是Axis2依赖的。由于这里的http请求和别的不太一样,其生命周期不是由Axis2自己管理的,而是由servlet容器管理的。所以有两个配置文件是必要的,一个就是在web.xml中注册org.apache.axis2.transport.http.AxisServlet。


<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
 id="WebApp_ID" version="2.5">
  <display-name>webServedisplay-name>

<servlet>
    <servlet-name>AxisServletservlet-name>
    <servlet-class>org.apache.axis2.transport.http.AxisServletservlet-class>
    <load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>  
 <servlet-name>AxisServletservlet-name>  
 <url-pattern>/services/*url-pattern>  
servlet-mapping> 


  <welcome-file-list>
    <welcome-file>index.jspwelcome-file>
  welcome-file-list>
web-app>

5.调整工程目录,引入Axis2运行环境

把tomcat安装目录下的webapps/axis2/WEB-INF下的modules、service和conf文件件拷至HelloWorld这个web工程的WEB-INF目录下。把lib下的如下jar包拷过去。然后再services下新建 :工程名/META-INF,本例就是HelloWorld/META-INF路径,META-INF下新建services.xml,内容如下:

<service name="HelloWorld">  
    <description>  
        HelloWorld Service Example
    description>  
    <parameter name="ServiceClass">  
        com.cm.service.HelloWorld
    parameter>  
    <operation name="sayHello">  
        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />  
    operation>  
    <operation name="saySorry">  
        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />  
    operation>  
    <operation name="getWorld">  
        <messageReceiver class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />  
    operation>  
service>

启动tomcat后访问http://127.0.0.1:8080/webServe/services/HelloWorld?wsdl能看到服务信息了。

使用Axis2开发webservice服务端接口+axis开发的客户端调用_第4张图片

到此Axis2的WebService服务已成功发布 。

6.用AXIS客户端调用。

客户端调用,说是AXIS框架还是CXF框架的客户端,其实都是引入对应的包而已,没有啥配置文件。然后就是java代码中要用的类需要引入对应的jar包中的类就行了。具体可以参考前面写的博文:基于cxf和axis两种框架下的webservice客户端开发
客户端调用java代码:

package com.zhanglf;

import java.net.URL;

import javax.jws.WebParam;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;

public class Axis2ClientTest {
    public static void main(String[] args) throws Exception {
        //一般如果没有注解targetNamespace的话,默认生成的就是接口这个文件的路径名
        String nameSpaceURI = "http://service.cm.com";
        String publishUrl = "http://127.0.0.1:8080/webServe/services/HelloWorld?wsdl";
        Service service = new Service();
        Call call = (Call) service.createCall();
        call.setTargetEndpointAddress(new URL(publishUrl));
        //指定接口路径,要调用的方法名
        call.setOperationName(new QName(nameSpaceURI, "saySorry"));
        //如果没用@WebParam(name="name")来表明参数名,则方法的入参是啥,这边就必须传一样的参数名才行。不然报错。
        call.addParameter("userName", XMLType.XSD_STRING, ParameterMode.IN);
        call.setReturnType(XMLType.XSD_STRING);
        String name = "zhanglifeng";
        Object[] obj = new Object[] { name };
        String result = (String) call.invoke(obj);

        System.out.println(result);
    }
}

可以看到控制台打印结果:
使用Axis2开发webservice服务端接口+axis开发的客户端调用_第5张图片

你可能感兴趣的:(客户端服务端通信实现方式)