1. 程式人生 > >使用Axis2開發webservice服務端介面+axis開發的客戶端呼叫

使用Axis2開發webservice服務端介面+axis開發的客戶端呼叫

之前用了cxf框架開發了服務端。為了區別二者的特點,區分了解。今天用axis2框架開發服務端。這裡感謝博主javawebsoa的文章:用AXIS2釋出WebService的方法。這裡自己在記錄一下自己的開發思路。

環境:
jdk:發現要求不高。1.5及以上版本都可以。
tomcat:tomcat7.0.72
axis2+web+tomcat

1.下載jar包

點選 axis2官網 進入下載頁面如下圖,我們只需要下載war.zip這個就夠用了。

這裡寫圖片描述

進入下載頁面,下載點選圖示連結即可完成下載。
這裡寫圖片描述

2.小試牛刀。

下載完後解壓,把axis2.war拷貝至tomcat安裝目錄下的webapps資料夾下,啟動tomcat後,在webapps目錄下會生成axis2資料夾。 訪問

http://localhost:8080/axis2/能看到以下頁面表示axis2執行成功。如下圖

這裡寫圖片描述

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。

<?xml version="1.0" encoding="UTF-8"?>
<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>webServe</display-name>

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

<!--Axis2  end-->
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-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>

這裡寫圖片描述

到此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);
    }
}

可以看到控制檯列印結果:
這裡寫圖片描述