譯: 3. Axis2快速入門指南


本指南的目的是讓您盡快使用Axis2開始創建服務和客戶端。我們將采用一個簡單的StockQuote服務,向您展示可以創建和部署它的一些不同方式,以及快速查看Axis2附帶的一個或兩個實用程序。然后,我們將介紹如何創建客戶端以訪問這些服務。

內容

  • 介紹
  • 做好准備
  • Axis2服務
  • 創造服務
    • 部署POJO
    • 使用AXIOM構建服務
    • 使用ADB生成服務
    • 使用XMLBeans生成服務
    • 使用JiBX生成服務
  • 生成客戶端
    • 使用AXIOM創建客戶端
    • 使用ADB生成客戶端
    • 使用XML Bean生成客戶端
    • 使用JiBX生成客戶端
  • 摘要
  • 進一步研究

快速安裝說明:

該文檔的代碼可以在提取的標准二進制分發中找到,更具體地說,可以在目錄中的Axis2_HOME / samples /中找到 - quickstart,quickstartadb,quickstartaxiom,quickstartjibx和quickstartxmlbeans。(考慮現在獲取它,因為它將幫助您繼續。)它包括Ant構建文件(build.xml),我們將在整個示例中引用它們以使編譯更容易。

介紹

讓我們從服務本身開始。我們將簡化,以便您可以看到構建和部署服務時發生的事情。在這樣的實例中,StockQuoteService示例似乎是必需的,所以讓我們使用以下代碼(參見代碼清單1)。

代碼清單1:StockQuoteService類

package samples.quickstart.service.pojo;

import java.util.HashMap;

public class StockQuoteService {
    private HashMap map = new HashMap();

    public double getPrice(String symbol) {
        Double price = (Double) map.get(symbol);
        if(price != null){
            return price.doubleValue();
        }
        return 42.00;
    }

    public void update(String symbol, double price) {
        map.put(symbol, new Double(price));
    }
}

這將是一個簡單的服務,有兩個可能的調用。其中一個是輸入/輸出消息,另一個是only-in 的服務。最終,我們將打包服務並以四種不同的方式部署它。

首先,讓我們看看這個簡單的Java類如何與服務相對應。

做好准備

在我們使用Axis2構建任何東西之前,我們必須處理一些內務管理。首先,您需要准備好使用Axis2的環境。幸運的是,它只涉及幾個簡單的步驟:

  1. 下載並安裝Java(最低版本為JDK1.5)。將JAVA_HOME環境變量設置為安裝JDK版本的目錄的路徑名。
  2. 下載Axis2並將其解壓縮到目標目錄。
  3. 將axis2.war文件復制到servlet引擎的webapps目錄。
  4. 將AXIS2_HOME環境變量設置為指向步驟中的目標目錄。請注意,Axis2生成的所有腳本和構建文件都取決於此值,因此請勿跳過此步驟!Linux用戶也可以在AXIS2_HOME / bin目錄中運行setenv.sh文件,將AXIS2_HOME環境變量設置為解壓縮的Axis2目錄的路徑名。

在大多數情況下,我們還需要一個WSDL文件來提供服務。Axis2的Java2WSDL可用於引導WSDL。要從Java類生成WSDL文件,請執行以下步驟:

  1. 創建並編譯Java類。
(Windows)
%AXIS2_HOME%\bin\java2wsdl.bat -cp . -cn samples.quickstart.service.pojo.StockQuoteService -of StockQuoteService.wsdl

(Linux)
$AXIS2_HOME/bin/java2wsdl.sh -cp . -cn samples.quickstart.service.pojo.StockQuoteService -of StockQuoteService.wsdl
  1. 使用以下命令生成WSDL:

生成WSDL文件后,您可以進行所需的更改。例如,您可以添加自定義錯誤或更改生成的元素的名稱。例如,此StockQuoteService.wsdl位於AXIS2_HOME / samples / quickstartadb / resources / META-INF文件夾中,我們將在本指南的其余部分中使用該文件夾,替換生成過程創建的通用參數。

Axis2服務

在我們構建任何東西之前,了解成品的外觀是有幫助的。

Axis2的服務器端可以部署在任何Servlet引擎上,並具有以下結構。如代碼清單2所示。

代碼清單2:axis2.war的目錄結構

axis2-web 
META-INF
WEB-INF
    classes 
    conf
        axis2.xml 
    lib
        activation.jar
        ...
        xmlSchema.jar
    modules
        modules.list 
        addressing.mar
        ...
        soapmonitor.mar
    services
        services.list
        aservice.aar
        ...
        version.aar
    web.xml

從頂部開始,axis2-web是構成Axis2管理應用程序的JSP集合,通過它您可以執行任何操作,例如添加服務以及參與和取消模塊。WEB-INF目錄包含實際的java類和其他支持文件,用於運行部署到services目錄的任何服務。

所有這些中的主要文件是axis2.xml,它控制應用程序如何處理收到的消息,確定Axis2是否需要應用modules目錄中定義的任何模塊。

如您所見,服務可以部署為* .aar文件,但其內容必須以特定方式排列。例如,該服務的結構如下:

- StockQuoteService
   - META-INF
     - services.xml
   - lib
   - samples
     - quickstart
       - service
         - pojo
           - StockQuoteService.class

這里,服務的名稱是StockQuoteService,它在services.xml文件中指定,並對應於此服務的頂級文件夾。編譯的Java類根據包名稱放置在適當的位置。lib目錄包含服務運行所需的任何特定於服務的JAR文件(在本例中為none),除了那些已經與Axis2 WAR文件和servlet容器的公共JAR目錄一起存儲的文件。最后,META-INF目錄包含有關Axis2正確執行它所需服務的任何其他信息。services.xml文件定義服務本身並將Java類鏈接到它(參見代碼清單3)。

代碼3:服務定義文件

<service name="StockQuoteService" scope="application">
    <description>
        Stock Quote Sample Service
    </description>
    <messageReceivers>
        <messageReceiver 
            mep="http://www.w3.org/ns/wsdl/in-only"
    class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
        <messageReceiver
            mep="http://www.w3.org/ns/wsdl/in-out"
    class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
    </messageReceivers>
    <parameter name="ServiceClass">
        samples.quickstart.service.pojo.StockQuoteService
    </parameter>
</service>

這里定義了服務,以及不同消息交換模式的相關messageReceiver類型。

META-INF目錄也是您打算為此應用程序包含的任何自定義WSDL文件的位置。

您可以通過簡單地獲取此文件層次結構並將其復制到servlet引擎的webapps / axis2 / WEB-INF / services目錄來部署服務。(注意,必須首先在servlet引擎中安裝Axis2 WAR文件。)這稱為“爆炸”格式。您還可以將文檔壓縮為* .aar文件,類似於* .jar文件,並將* .aar文件直接放在servlet引擎的webapps / axis2 / WEB-INF / services目錄中。

現在您了解了我們正在努力實現的目標,我們已經准備好開始構建。

首先,下載 並解壓縮適當版本的Axis2標准二進制分發版。確保將AXIS2_HOME變量的值設置為與解壓縮此版本內容的位置相匹配。

讓我們看一下創建客戶端和服務的一些不同方法。

創建服務

在本節中,我們將介紹基於StockQuoteService類創建服務的五種方法:部署普通舊Java對象(PO​​JO),使用AXIOM的OMElement構建服務,使用Axis2數據綁定框架(ADB)生成服務,生成使用XMLBeans進行服務,並使用JiBX生成服務。

部署POJO

要使用POJO(Plain Old Java Objects)部署服務,請執行以下步驟。

請注意AXIS2_HOME / samples / quickstart中包含的目錄結構(services.xml文件來自本指南的第一部分):

- quickstart
   - README.txt
   - build.xml
   - resources
     - META-INF
       - services.xml
   - src
     - samples
       - quickstart
         - service
           - pojo
             - StockQuoteService.java

請注意,您可以通過鍵入以下內容從quickstart目錄生成WSDL:

ant generate.wsdl

但是,創建StockQuoteService.wsdl是可選的。它可以是直接從Java類生成的版本,也可以是該文件的自定義版本,而services.xml與本文檔前面引用的文件相同。

現在通過在quickstart目錄中鍵入ant generate.service來構建項目,該目錄創建以下目錄結構:

- quickstart/build/classes
   - META-INF
     - services.xml
   - samples
     - quickstart
       - service
         - pojo
           - StockQuoteService.class

如果要以展開的目錄格式部署服務,請將classes目錄重命名為StockQuoteService,並將其復制到servlet引擎中的webapps / axis2 / WEB-INF / services目錄。否則,將build / StockQuoteService.aar文件復制到servlet引擎中的webapps / axis2 / WEB-INF / services目錄。然后通過查看以下服務列表來檢查以確保服務已正確部署:

http://localhost:8080/axis2/services/listServices

您還可以在以下位置查看WSDL:

http://localhost:8080/axis2/services/StockQuoteService?wsdl

the schema 在

http://localhost:8080/axis2/services/StockQuoteService?xsd

URL正常工作后,快速測試服務。嘗試將瀏覽器指向以下URL:

http://localhost:8080/axis2/services/StockQuoteService/getPrice?symbol=IBM

您將收到以下響應:

<ns:getPriceResponse xmlns:ns="http://pojo.service.quickstart.samples/xsd"><ns:return>42</ns:return></ns:getPriceResponse>

如果您調用更新方法,

http://localhost:8080/axis2/services/StockQuoteService/update?symbol=IBM&price=100

然后執行第一個getPrice URL,您將看到價格已更新。

使用AXIOM構建服務

 要使用AXIOM“從頭開始”構建服務,請執行以下步驟。

請注意/ samples / quickstartaxiom中包含的目錄結構:

- quickstartaxiom
   - README.txt
   - build.xml
   - resources
     - META-INF
       - services.xml
       - StockQuoteService.wsdl
   - src
     - samples
       - quickstart
         - service
           - axiom
             - StockQuoteService.java
         - clients
           - AXIOMClient.java

由於AXIOM略有不同,因此您需要一個與POJO不同的service.xml文件。定義它,如代碼清單4所示。

代碼4:服務定義文件。

<service name="StockQuoteService" scope="application">
    <description>
        Stock Quote Service
    </description>
    <operation name="getPrice">
        <messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
    </operation>
    <operation name="update">
        <messageReceiver class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
    </operation>
    <parameter name="ServiceClass">samples.quickstart.service.axiom.StockQuoteService</parameter>
</service>

請注意,它幾乎相同,只是在service.xml文件中顯式定義了操作,MessageReceivers現在是RawXML。

現在,上面引用的StockQuoteService.java類是一個使用Axis2庫中的類的普通Java類,其定義如代碼清單5所示。

代碼5:使用AXIOM的StockQuoteService類

package samples.quickstart.service.axiom;

import javax.xml.stream.XMLStreamException;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;

import java.util.HashMap;
public class StockQuoteService {
    private HashMap map = new HashMap();

    public OMElement getPrice(OMElement element) throws XMLStreamException {
        element.build();
        element.detach();

        OMElement symbolElement = element.getFirstElement();
        String symbol = symbolElement.getText();

        String returnText = "42";
        Double price = (Double) map.get(symbol);
        if(price != null){
            returnText  = "" + price.doubleValue();
        }
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs =
            fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd", "tns");
        OMElement method = fac.createOMElement("getPriceResponse", omNs);
        OMElement value = fac.createOMElement("price", omNs);
        value.addChild(fac.createOMText(value, returnText));
        method.addChild(value);
        return method;
    }

    public void update(OMElement element) throws XMLStreamException {
        element.build();
        element.detach();

        OMElement symbolElement = element.getFirstElement();
        String symbol = symbolElement.getText();

        OMElement priceElement = (OMElement)symbolElement.getNextOMSibling();
        String price = priceElement.getText();

        map.put(symbol, new Double(price));
    }
}

Axis2使用AXIOM,或AXIs對象模型,類似於DOM(文檔對象模型)的結構,它基於StAX API(用於XML的Streaming API)。充當服務的方法必須將OMElement作為其參數,OMElement表示在這種情況下發生的XML元素是傳入SOAP消息的有效負載。例如,方法getPrice(OMElement)提取有效負載元素的第一個子元素的內容,該元素對應於股票代碼,並使用它來查找股票的當前價格。除非這是“僅在”服務,否則這些方法必須返回OMElement,因為它成為返回SOAP消息的有效負載。

現在通過在Axis2_HOME / samples / quickstartaxiom目錄中鍵入ant generate.service來構建項目。

將StockQuoteService.aar文件放在servlet引擎的webapps / axis2 / WEB-INF / services目錄中,並通過查看服務列表來檢查是否已正確部署該服務,

http://localhost:8080/axis2/services/listServices

 您還可以在以下位置檢查自定義WSDL:

http://localhost:8080/axis2/services/StockQuoteService?wsdl

 the schema

http://localhost:8080/axis2/services/StockQuoteService?xsd

使用ADB生成服務

要使用Axis2數據綁定框架(ADB)生成和部署服務,請執行以下步驟。

通過在Axis2_HOME / samples / quickstartadb目錄中鍵入以下內容,使用WSDL2Java實用程序生成框架:

(Windows)
%AXIS2_HOME%\bin\wsdl2java.bat -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.service.adb -d adb -s -ss -sd -ssi -o build\service

(Linux)
$AXIS2_HOME/bin/wsdl2java.sh -uri resources/META-INF/StockQuoteService.wsdl -p samples.quickstart.service.adb -d adb -s -ss -sd -ssi -o build/service

否則,只需在Axis2_HOME / samples / quickstartadb目錄中鍵入ant generate.service即可。

選項-d adb指定軸數據綁定(ADB)。-s開關僅指定同步或阻塞調用。-ss開關創建服務器端代碼(框架和相關文件)。-sd開關創建服務描述符(services.xml文件)。-ssi開關為服務框架創建一個接口。現在,服務文件應位於構建/服務中。

如果您直接使用WSDL2Java生成代碼,接下來您必須修改生成的框架以實現服務(如果您使用“ant generate.service”,則完成的框架將自動復制到生成的框架上)。

打開build / service / src / samples / quickstart / adb / service / StockQuoteServiceSkeleton.java文件並對其進行修改,以將服務的功能添加到生成的方法中; 如代碼清單6所示。

代碼6:定義服務骨架文件

package samples.quickstart.service.adb;

import samples.quickstart.service.adb.xsd.GetPriceResponse;
import samples.quickstart.service.adb.xsd.Update;
import samples.quickstart.service.adb.xsd.GetPrice;

import java.util.HashMap;

public class StockQuoteServiceSkeleton implements StockQuoteServiceSkeletonInterface {

    private static HashMap map;

    static{ map = new HashMap(); }

    public void update(Update param0) {
        map.put(param0.getSymbol(), new Double(param0.getPrice()));
    }

    public GetPriceResponse getPrice(GetPrice param1) {
        Double price = (Double) map.get(param1.getSymbol());
        double ret = 42;
        if(price != null){
            ret = price.doubleValue();
        }
        GetPriceResponse res =
                new GetPriceResponse();
        res.set_return(ret);
        return res;
    }
}

現在,您可以通過在build / service目錄中鍵入以下命令來構建項目:

ant jar.server

如果一切順利,您應該在窗口中看到BUILD SUCCESSFUL消息,並在build / service / build / lib目錄中看到StockQuoteService.aar文件。將此文件復制到servlet引擎的webapps / axis2 / WEB-INF / services目錄。

您可以通過查看服務列表來檢查以確保服務已正確部署,

http://localhost:8080/axis2/services/listServices

 您還可以在以下位置檢查自定義WSDL:

http://localhost:8080/axis2/services/StockQuoteService?wsdl

 the schema 

http://localhost:8080/axis2/services/StockQuoteService?xsd

使用XMLBeans生成服務

要使用XMLBeans生成服務,請執行以下步驟。

通過在Axis2_HOME / samples / quickstartxmlbeans目錄中鍵入以下內容,使用WSDL2Java實用程序生成框架

%AXIS2_HOME%\bin\wsdl2java.bat -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.service.xmlbeans -d xmlbeans -s -ss -sd -ssi -o build\service

否則,只需在Axis2_HOME / samples / quickstartxmlbeans目錄中鍵入ant generate.service。

選項-d xmlbeans指定XML Bean數據綁定。-s開關僅指定同步或阻塞調用。-ss開關創建服務器端代碼(框架和相關文件)。-sd開關創建服務描述符(services.xml文件)。-ssi開關為服務框架創建一個接口。現在,服務文件應位於構建/服務中。

如果您直接使用WSDL2Java生成代碼,接下來您必須修改生成的框架以實現服務(如果您使用“ant generate.service”,則完成的框架將自動復制到生成的框架上)。

接下來打開build / service / src / samples / quickstart / service / xmlbeans / StockQuoteServiceSkeleton.java文件並修改它以將服務的功能添加到生成的方法中(參見代碼清單7)。

代碼7:定義服務框架

package samples.quickstart.service.xmlbeans;

import samples.quickstart.service.xmlbeans.xsd.GetPriceDocument;
import samples.quickstart.service.xmlbeans.xsd.GetPriceResponseDocument;
import samples.quickstart.service.xmlbeans.xsd.UpdateDocument;

import java.util.HashMap;

public class StockQuoteServiceSkeleton implements StockQuoteServiceSkeletonInterface {

    private static HashMap map;

    static{ map = new HashMap(); }

    public void update(UpdateDocument param0) {
        map.put(param0.getUpdate().getSymbol(), new Double(param0.getUpdate().getPrice()));
    }

    public GetPriceResponseDocument getPrice(GetPriceDocument param1) {
        Double price = (Double) map.get(param1.getGetPrice().getSymbol());
        double ret = 42;
        if(price != null){
            ret = price.doubleValue();
        }
        System.err.println();
        GetPriceResponseDocument resDoc =
                GetPriceResponseDocument.Factory.newInstance();
        GetPriceResponseDocument.GetPriceResponse res =
                resDoc.addNewGetPriceResponse();
        res.setReturn(ret);
        return resDoc;
    }
}

通過在build / service目錄中鍵入以下命令來構建項目,該目錄包含build.xml文件:

ant jar.server

如果一切順利,您應該在窗口中看到BUILD SUCCESSFUL消息,並在新創建的build / service / build / lib目錄中看到StockQuoteService.aar文件。將此文件復制到servlet引擎的webapps / axis2 / WEB-INF / services目錄。

您可以通過查看服務列表來檢查以確保服務已正確部署,

http://localhost:8080/axis2/services/listServices

您還可以在以下位置檢查自定義WSDL:

http://localhost:8080/axis2/services/StockQuoteService?wsdl

schema 

http://localhost:8080/axis2/services/StockQuoteService?xsd

使用JiBX生成服務

要使用JiBX數據綁定生成和部署服務,請執行以下步驟。

通過在Axis2_HOME / samples / quickstartjibx目錄中的控制台上鍵入以下內容,使用WSDL2Java實用程序生成框架

%AXIS2_HOME%\bin\wsdl2java.bat -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.service.jibx -d jibx -s -ss -sd -ssi -uw -o build\service

否則,只需在Axis2_HOME / samples / quickstartjibx目錄中鍵入“ant generate.service”即可。

選項-d jibx指定JiBX數據綁定。-s開關僅指定同步或阻塞調用。-ss開關創建服務器端代碼(框架和相關文件)。-sd開關創建服務描述符(services.xml文件)。-ssi開關為服務框架創建一個接口。-uw開關打開傳入和傳出服務操作的參數,以創建更自然的編程接口。

運行WSDL2Java后,服務文件應位於build / service。如果直接使用WSDL2Java生成代碼,則需要修改生成的框架以實現服務(如果使用“ant generate.service”,則完成的框架將自動復制到生成的框架上)。打開build / service / src / samples / quickstart / service / jibx / StockQuoteServiceSkeleton.java文件並對其進行修改,以將服務的功能添加到生成的方法中,如代碼清單8所示。

代碼8:定義服務框架文件

package samples.quickstart.service.jibx;

import java.util.HashMap;

public class StockQuoteServiceSkeleton implements StockQuoteServiceSkeletonInterface {
    private HashMap map = new HashMap();

    public void update(String symbol, Double price) {
        map.put(symbol, price);
    }

    public Double getPrice(String symbol) {
        Double ret = (Double) map.get(symbol);
        if (ret == null) {
            ret = new Double(42.0);
        }
        return ret;
    }
}

現在,您可以通過在build / service目錄中鍵入以下命令來構建項目:

ant jar.server

如果一切順利,您應該在窗口中看到BUILD SUCCESSFUL消息,並在build / service / build / lib目錄中看到StockQuoteService.aar文件。將此文件復制到servlet引擎的webapps / axis2 / WEB-INF / services目錄。

您可以通過查看服務列表來檢查以確保服務已正確部署,

http://localhost:8080/axis2/services/listServices

您還可以在以下位置檢查自定義WSDL:

http://localhost:8080/axis2/services/StockQuoteService?wsdl

schema

http://localhost:8080/axis2/services/StockQuoteService?xsd

 

 更多學習信息:JiBX code generation integration

創建客戶端

在本節中,我們將介紹基於StockQuoteService類創建客戶端的四種方法:構建基於AXIOM的客戶端,使用Axis2數據綁定框架(ADB)生成客戶端,使用XMLBeans生成客戶端,以及使用JiBX生成客戶端。

使用AXIOM創建客戶端

要使用AXIOM構建客戶端,請執行以下步驟。

另請注意“使用AXIOM創建服務”部分中顯示的目錄結構,下面重復完整性。

- quickstartaxiom
   - README.txt
   - build.xml
   - resources
     - META-INF
       - services.xml
       - StockQuoteService.wsdl
   - src
     - samples
       - quickstart
         - service
           - axiom
             - StockQuoteService.java
         - clients
           - AXIOMClient.java

上面引用的AXIOMClient.java類定義如下,如代碼清單9所示。

代碼9:使用AXIOM的AXIOMClient類

package samples.quickstart.clients;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

public class AXIOMClient {

    private static EndpointReference targetEPR = 
        new EndpointReference("http://localhost:8080/axis2/services/StockQuoteService");

    public static OMElement getPricePayload(String symbol) {
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd", "tns");

        OMElement method = fac.createOMElement("getPrice", omNs);
        OMElement value = fac.createOMElement("symbol", omNs);
        value.addChild(fac.createOMText(value, symbol));
        method.addChild(value);
        return method;
    }

    public static OMElement updatePayload(String symbol, double price) {
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd", "tns");

        OMElement method = fac.createOMElement("update", omNs);

        OMElement value1 = fac.createOMElement("symbol", omNs);
        value1.addChild(fac.createOMText(value1, symbol));
        method.addChild(value1);

        OMElement value2 = fac.createOMElement("price", omNs);
        value2.addChild(fac.createOMText(value2,
                                         Double.toString(price)));
        method.addChild(value2);
        return method;
    }

    public static void main(String[] args) {
        try {
            OMElement getPricePayload = getPricePayload("WSO");
            OMElement updatePayload = updatePayload("WSO", 123.42);
            Options options = new Options();
            options.setTo(targetEPR);
            options.setTransportInProtocol(Constants.TRANSPORT_HTTP);

            ServiceClient sender = new ServiceClient();
            sender.setOptions(options);

            sender.fireAndForget(updatePayload);
            System.err.println("price updated");
            OMElement result = sender.sendReceive(getPricePayload);

            String response = result.getFirstElement().getText();
            System.err.println("Current price of WSO: " + response);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}

Axis2使用AXIOM,或AXIs對象模型,類似於DOM(文檔對象模型)的結構,它基於StAX API(用於XML的Streaming API)。在這里,您可以為服務的更新和getPrice方法設置有效負載。創建有效負載的方式類似於為AXIOM服務創建getPriceResponse有效負載的方式。然后設置Options類,並創建一個ServiceClient,用於與服務進行通信。首先調用update方法,這是一個不返回任何內容的fireAndForget方法。最后,您調用getPrice方法,並從服務中檢索當前價格並顯示它。

現在,您可以通過在Axis2_HOME / samples / quickstartaxiom目錄中鍵入ant run.client來構建和運行AXIOM客戶端。

您應該獲得以下輸出:

done
Current price of WSO: 123.42

使用ADB生成客戶端

要使用Axis Data Binding(ADB)構建客戶端,請執行以下步驟。

通過在Axis2_HOME / samples / quickstartadb目錄中鍵入以下內容來生成客戶端數據綁定:

%AXIS2_HOME%\bin\wsdl2java.bat -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.clients -d adb -s -o build\client

另外,只需在Axis2_HOME / samples / quickstartadb目錄中輸入ant generate.client即可。

接下來看一下quickstartadb / src / samples / quickstart / clients / ADBClient.java,看看它是如何在代碼清單10中定義的。

代碼10:ADBClient類

package samples.quickstart.clients;

import samples.quickstart.service.adb.StockQuoteServiceStub;

public class ADBClient{
    public static void main(java.lang.String args[]){
        try{
            StockQuoteServiceStub stub =
                new StockQuoteServiceStub
                ("http://localhost:8080/axis2/services/StockQuoteService");

            getPrice(stub);
            update(stub);
            getPrice(stub);

        } catch(Exception e){
            e.printStackTrace();
            System.err.println("\n\n\n");
        }
    }

    /* fire and forget */
    public static void update(StockQuoteServiceStub stub){
        try{
            StockQuoteServiceStub.Update req = new StockQuoteServiceStub.Update();
            req.setSymbol ("ABC");
            req.setPrice (42.35);

            stub.update(req);
            System.err.println("price updated");
        } catch(Exception e){
            e.printStackTrace();
            System.err.println("\n\n\n");
        }
    }

    /* two way call/receive */
    public static void getPrice(StockQuoteServiceStub stub){
        try{
            StockQuoteServiceStub.GetPrice req = new StockQuoteServiceStub.GetPrice();

            req.setSymbol("ABC");

            StockQuoteServiceStub.GetPriceResponse res =
                stub.getPrice(req);

            System.err.println(res.get_return());
        } catch(Exception e){
            e.printStackTrace();
            System.err.println("\n\n\n");
        }
    }

}

此類使用您創建的Axis Data Bindings創建客戶端存根。然后它調用Web服務上的getPrice和更新操作。getPrice方法操作創建GetPrice有效內容並將符號設置為ABC。然后它發送請求並顯示當前價格。update方法創建Update有效負載,將符號設置為ABC,價格設置為42.35。

現在通過在Axis2_HOME / samples / quickstartadb目錄中鍵入ant run.client來構建和運行客戶端。

您應該獲得以下輸出:

42
price updated
42.35

使用XMLBeans生成客戶端

要使用XML Bean數據綁定構建客戶端,請執行以下步驟。

通過在xmlbeansClient目錄中鍵入以下內容來生成數據庫。

%AXIS2_HOME%\bin\wsdl2java.bat -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.service.xmlbeans -d xmlbeans -s -o build\client

另外,只需在Axis2_HOME / samples / quickstartxmlbeans目錄中鍵入ant generate.client即可。

請注意,這會創建客戶端存根代碼而不會創建服務器端代碼。

接下來看一下quickstartxmlbeans / src / samples / quickstart / clients / XMLBEANSClient.java,看看它是如何在代碼清單11中定義的。

代碼11:XMLBEANSClient類

package samples.quickstart.clients;

import samples.quickstart.service.xmlbeans.StockQuoteServiceStub;
import samples.quickstart.service.xmlbeans.xsd.GetPriceDocument;
import samples.quickstart.service.xmlbeans.xsd.GetPriceResponseDocument;
import samples.quickstart.service.xmlbeans.xsd.UpdateDocument;

public class XMLBEANSClient{

    public static void main(java.lang.String args[]){
        try{
            StockQuoteServiceStub stub =
                new StockQuoteServiceStub
                ("http://localhost:8080/axis2/services/StockQuoteService");

            getPrice(stub);
            update(stub);
            getPrice(stub);

        } catch(Exception e){
            e.printStackTrace();
            System.err.println("\n\n\n");
        }
    }

    /* fire and forget */
    public static void update(StockQuoteServiceStub stub){
        try{
            UpdateDocument reqDoc = UpdateDocument.Factory.newInstance();
            UpdateDocument.Update req = reqDoc.addNewUpdate();
            req.setSymbol ("BCD");
            req.setPrice (42.32);

            stub.update(reqDoc);
            System.err.println("price updated");
        } catch(Exception e){
            e.printStackTrace();
            System.err.println("\n\n\n");
        }
    }

    /* two way call/receive */
    public static void getPrice(StockQuoteServiceStub stub){
        try{
            GetPriceDocument reqDoc = GetPriceDocument.Factory.newInstance();
            GetPriceDocument.GetPrice req = reqDoc.addNewGetPrice();
            req.setSymbol("BCD");

            GetPriceResponseDocument res =
                stub.getPrice(reqDoc);

            System.err.println(res.getGetPriceResponse().getReturn());
        } catch(Exception e){
            e.printStackTrace();
            System.err.println("\n\n\n");
        }
    }
}

此類使用您創建的XML Beans數據綁定創建客戶端存根。然后它調用Web服務上的getPrice和更新操作。getPrice方法操作創建GetPriceDocument,其內部GetPrice類並將符號設置為ABC。然后它發送請求並檢索GetPriceResponseDocument並顯示當前價格。update方法創建一個UpdateDocument,更新並將符號設置為ABC並將價格設置為42.32,完成后顯示“done”。

現在通過在Axis2_HOME / samples / quickstartxmlbeans目錄中鍵入ant run.client來構建和運行項目。

您應該獲得以下輸出:

42
price updated
42.32

使用JiBX生成客戶端

要使用JiBX構建客戶端,請執行以下步驟。

通過在Axis2_HOME / samples / quickstartjibx目錄中的控制台上鍵入以下內容來生成客戶端存根。

%AXIS2_HOME%\bin\wsdl2java.bat -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.clients -d jibx -s -uw -o build\client

否則,只需輸入“ant generate.client”即可。

接下來看一下quickstartjibx / src / samples / quickstart / clients / JiBXClient.java,如下面的代碼清單12所示。

代碼12:JiBXClient類

package samples.quickstart.clients;

import samples.quickstart.service.jibx.StockQuoteServiceStub;

public class JiBXClient{
    public static void main(java.lang.String args[]){
        try{
            StockQuoteServiceStub stub =
                new StockQuoteServiceStub
                ("http://localhost:8080/axis2/services/StockQuoteService");

            getPrice(stub);
            update(stub);
            getPrice(stub);

        } catch(Exception e){
            e.printStackTrace();
            System.err.println("\n\n\n");
        }
    }

    /* fire and forget */
    public static void update(StockQuoteServiceStub stub){
        try{
            stub.update("CDE", new Double(42.35));
            System.err.println("price updated");
        } catch(Exception e){
            e.printStackTrace();
            System.err.println("\n\n\n");
        }
    }

    /* two way call/receive */
    public static void getPrice(StockQuoteServiceStub stub){
        try{
            System.err.println(stub.getPrice("CDE"));
        } catch(Exception e){
            e.printStackTrace();
            System.err.println("\n\n\n");
        }
    }

}

此類使用創建的JiBX客戶端存根來訪問Web服務上的getPrice和更新操作。getPrice方法發送股票“ABC”的請求並顯示當前價格。更新方法將庫存“ABC”的價格設置為42.35。

現在通過在Axis2_HOME / samples / quickstartjibx目錄中的控制台鍵入“ant run.client”來構建和運行客戶端。

您應該獲得以下輸出:

42
price updated
42.35

 

更多信息,JiBX code generation integration 

摘要

Axis2提供了一種靈活而強大的方式,可以立即啟動和運行Web服務。本指南介紹了創建可在Axis2上部署的服務的五種方法,以及創建與服務進行通信的客戶端的四種方法。您現在可以使用各種不同的技術靈活地創建Web服務。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM