<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Terry.Li-彬

    虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
    原文鏈接:http://ws.apache.org/axis2/1_1_1/quickstartguide.html
    本指南的目的是讓你盡可能快的創(chuàng)建使用Axis2的服務和客戶端,我們將使用一個簡單的StockQuote服務并顯示給你一些創(chuàng)建和部署它
    的不同的方式,以及快速的看看Axis2自帶的一些工具,然后我們將看看創(chuàng)建訪問這些服務的客戶端。

    內容
    Java代碼
    1. 介紹??
    2. 做好準備??
    3. Axis2服務??
    4. 創(chuàng)建服務??
    5. ????部署POJOs??
    6. ????使用AXIOM構建服務??
    7. ????使用ADB生成服務??
    8. ????使用XMLBeans生成服務??
    9. ????使用JiBX生成服務??
    10. 生成客戶端??
    11. ????使用AXIOM創(chuàng)建一個客戶端??
    12. ????使用ADB生成一個客戶端??
    13. ????使用XMLBeans生成一個客戶端??
    14. ????使用JiBX生成一個客戶端??
    15. 總結??
    16. 進一步學習??


    快速安裝筆記:
    文檔的代碼可以在解壓的標準二進制發(fā)布[/url]找到,更明確的位于其中的Axis2_HOME/samples/目錄-quickstart,quickstartdb,
    quickstartaxiom,quickstartjibx和quickstartxmlbeans,如果你繼續(xù)下去它將幫你掌握它。它包含一個Ant構建文件(build.xml)
    貫穿所有的例子我們將提到它來使得編譯更容易。

    介紹
    讓我們以服務本身開始。我們將使它簡單,所以你可以看到當我們構建并部署服務時會發(fā)生什么,一個StockQuoteService例子看起來
    像這個,所以讓我們使用下面的(參看Code Listing 1)。
    Code Listing 1: StockQuoteService類
    Java代碼
    1. package?samples.quickstart.service.pojo;??
    2. ??
    3. import?java.util.HashMap;??
    4. ??
    5. public?class?StockQuoteService?{??
    6. ????private?HashMap?map?=?new?HashMap();??
    7. ??
    8. ????public?double?getPrice(String?symbol)?{??
    9. ????????Double?price?=?(Double)?map.get(symbol);??
    10. ????????if(price?!=?null){??
    11. ????????????return?price.doubleValue();??
    12. ????????}??
    13. ????????return?42.00;??
    14. ????}??
    15. ??
    16. ????public?void?update(String?symbol,?double?price)?{??
    17. ????????map.put(symbol,?new?Double(price));??
    18. ????}??
    19. }??

    它將為一個具有兩個可能的調用的簡單服務,其中一個是一個in/out消息,另一個則為一個只能in的服務,最終我們將打包服務并用
    四種不同的方式部署部署它。
    首先,讓我們看看這個簡單的Java類怎樣響應一個服務。

    做好準備
    在我們使用Axis2構建任何東西之前,我們將需要關注一些家務事。現(xiàn)在你將需要準備好你使用Axis2的環(huán)境,幸運的是,它只包括一
    些簡單的步驟:
    1,下載并安裝Java(版本至少為JDK1.4)
    2,下載Axis2并解壓到一個目標目錄
    3,復制axis2.war文件到你的servlet引擎的webapps目錄
    4,設置AXIS2_HOME環(huán)境變量來指出目標目錄,注意Axis2生成的所有腳本和構建文件依賴于這個值,所以不要遺漏了這個步驟。
    大多數(shù)情況下,我們的服務也將需要一個WSDL文件,Axis2的Java2WSDL可以用來生成一個WSDL。執(zhí)行以下步驟來從一個Java類生成一
    個WSDL文件:
    1,創(chuàng)建并編譯Java類
    2,使用該命令生成WSDL:
    %AXIS2_HOME%/bin/java2wsdl -cp . -cn samples.quickstart.service.pojo.StockQuoteService -of StockQuoteService.wsdl
    移動你生成WSDL文件,你可以做你需要的任何更改。例如,你可能添加自定義的過錯或者改變生成的元素名。例如,該StockQuoteSer
    vice.wsdl位于%AXIS2_HOME%/samples/quickstartadb/resources/META-INF文件夾,我們將在本指南的其他部分使用它,代替生成過
    程創(chuàng)建的一般參數(shù)。

    Axis2服務
    在我們構建任何東西之前,理解最終產(chǎn)品看起來像什么是有用的。Axis2的服務器端可以被部署在任何Servlet引擎上,并且有如下的
    Code Listing 2顯示的結構。
    Code Listing 2: axis2.war的目錄結構
    Java代碼
    1. axis2-web???
    2. META-INF??
    3. WEB-INF??
    4. ????classes???
    5. ????conf??
    6. ????????axis2.xml???
    7. ????lib??
    8. ????????activation.jar??
    9. ????????...??
    10. ????????xmlSchema.jar??
    11. ????modules??
    12. ????????modules.list???
    13. ????????addressing.mar??
    14. ????????...??
    15. ????????soapmonitor.mar??
    16. ????services??
    17. ????????services.list??
    18. ????????aservice.aar??
    19. ????????...??
    20. ????????version.aar??
    21. ????web.xml??

    從最上面開始,axis2-web是組成Axis2管理程序的一些JSPs,你可以通過它來執(zhí)行任何需要的動作,例如添加服務,使用模塊和禁止
    模塊。WEB-INF包含了運行部署到服務目錄的任何服務的實際上的java類和其他支持文件。
    這里主要的文件是axis2.xml,它控制程序怎樣與接收的消息打交道,決定Axis2是否需要使用模塊目錄里定義的任何模塊。
    這里你可以看到,服務可以被部署為*.aar文件,但是它們的內容必須以一個特殊的方式安排。例如,服務的結構將為如下:
    Java代碼
    1. -?StockQuoteService??
    2. ???-?META-INF??
    3. ?????-?services.xml??
    4. ???-?samples??
    5. ?????-?quickstart??
    6. ???????-?service??
    7. ?????????-?pojo??
    8. ???????????-?StockQuoteService.class??

    這不是太復雜,服務的名字為StockQuoteService,它在services.xml中指定,并且根據(jù)包名把任何Java類放到合適的位置。META-INF
    目錄包含關于Axis2需要來正確執(zhí)行服務的額外信息。services.xml文件定義了服務本身并把Java類鏈接到它(參看Code Listing 3)。
    Code Listing 3: 服務定義文件
    Java代碼
    1. <service?name="StockQuoteService"?scope="application">??
    2. ????<description>??
    3. ????????Stock?Quote?Sample?Service??
    4. ????</description>??
    5. ????<messageReceivers>??
    6. ????????<messageReceiver???
    7. ????????????mep="http://www.w3.org/2004/08/wsdl/in-only"??
    8. ????class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>??
    9. ????????<messageReceiver??
    10. ????????????mep="http://www.w3.org/2004/08/wsdl/in-out"??
    11. ????class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>??
    12. ????</messageReceivers>??
    13. ????<parameter?name="ServiceClass">??
    14. ????????samples.quickstart.service.pojo.StockQuoteService??
    15. ????</parameter>??
    16. </service>??

    這里你看到服務本身被定義了,以及不同的消息交換模式相關的messageReceiver類型。
    META-INF目錄也是你打算包含在該程序中的自定義WSDL文件的位置。
    你可以通過簡單的采用該文件目錄結構并復制到你的servlet引擎的webapps目錄來部署一個服務,這是著名的"爆發(fā)"形式,但是你也
    可以壓縮你的文檔到一個*.aar文件,類似于一個*.jar文件,并直接將*.aar文件放到servlet引擎的webapps目錄。
    既然你理解了我們在嘗試完成什么,我們幾乎準備好開始構建了。
    首先,下載并解壓合適版本的Axis2標準二進制發(fā)布。確認你設置了AXIS2_HOME變量的值來匹配你解壓該版本內容的位置。
    讓我們看看一些創(chuàng)建客戶端和服務的不同方式。

    創(chuàng)建服務
    在這個部分,我們將看看根據(jù)StockQuoteService類創(chuàng)建服務的五種方式:部署Plain Old Java Objects(POJO),使用AXIOM的OMElement
    構建服務,使用Axis2 Databinding Framework(ADB)生成服務,使用XMLBeans生成服務和使用JiBX生成服務。

    部署POJOs
    使用POJOs(Plain Old Java Objects)來部署服務,執(zhí)行下面的步驟。
    注意包含在<AXIS2_HOME>/samples/quickstart的目錄結構(services.xml文件來自于該指南的第一個部分):
    Java代碼
    1. -?quickstart??
    2. ???-?README.txt??
    3. ???-?build.xml??
    4. ???-?resources??
    5. ?????-?META-INF??
    6. ???????-?services.xml??
    7. ???-?src??
    8. ?????-?samples??
    9. ???????-?quickstart??
    10. ?????????-?service??
    11. ???????????-?pojo??
    12. ?????????????-?StockQuoteService.java??

    注意你可以通過在quickstart目錄鍵入ant generate.wsdl來生成WSDL。
    盡管如此,創(chuàng)建StockQuoteService.wsdl是可選的。它可以是直接從Java類生成的版本,或者該文件的一個自定義版本,并且servi
    ces.xml是本文檔前面提到的同一文件。
    現(xiàn)在通過在quickstart目錄鍵入ant generate.service來構建工程,該目錄創(chuàng)建了以下目錄結構:
    Java代碼
    1. -?quickstart/build/classes??
    2. ???-?META-INF??
    3. ?????-?services.xml??
    4. ???-?samples??
    5. ?????-?quickstart??
    6. ???????-?service??
    7. ?????????-?pojo??
    8. ???????????-?StockQuoteService.class??

    如果你想以爆發(fā)形式部署服務,重命名classes目錄為StockQuoteService,并復制它到你的servlet引擎的webapps/axis2/WEB-INF/s
    ervices目錄。否則,復制build/StockQuoteService.aar文件到你的servlet引擎的webapps/axis2/WEB-INF/services目錄。然后通過
    視察以下服務列表來確認服務被正確部署:
    http://localhost:8080/axis2/services/listServices
    你也可以檢驗以下WSDL:
    http://localhost:8080/axis2/services/StockQuoteService?wsdl
    以及以下結構:
    http://localhost:8080/axis2/services/StockQuoteService?xsd
    一旦這些urls工作,讓我們快速測試一下服務。讓你的瀏覽器訪問以下URL試試:
    http://localhost:8080/axis2/rest/StockQuoteService/getPrice?symbol=IBM
    你將得到如下應答:
    Java代碼
    1. <ns:getPriceResponse?xmlns:ns="http://pojo.service.quickstart.samples/xsd"><ns:return>42</ns:return></ns:getPriceResponse>??

    如果你像這樣調用update方法:
    http://localhost:8080/axis2/rest/StockQuoteService/update?symbol=IBM&price=100
    然后調用第一個getPrice url。你可以看到price被更新了。

    使用AXIOM構建服務
    為了使用AXIOM"從零開始"構建一個服務,執(zhí)行以下步驟。
    注意包含在/samples/quickstartaxiom的目錄結構:
    Java代碼
    1. -?quickstartaxiom??
    2. ???-?README.txt??
    3. ???-?build.xml??
    4. ???-?resources??
    5. ?????-?META-INF??
    6. ???????-?services.xml??
    7. ???????-?StockQuoteService.wsdl??
    8. ???-?src??
    9. ?????-?samples??
    10. ???????-?quickstart??
    11. ?????????-?service??
    12. ???????????-?axiom??
    13. ?????????????-?StockQuoteService.java??
    14. ?????????-?clients??
    15. ???????????-?AXIOMClient.java??

    由于AXIOM有一點不同,你將需要一個與POJO所用不同的services.xml文件,在Code Listing 4中顯示了它的定義。
    Code Listing 4: 服務定義文件
    Java代碼
    1. <service?name="StockQuoteService"?scope="application">??
    2. ????<description>??
    3. ????????Stock?Quote?Service??
    4. ????</description>??
    5. ????<operation?name="getPrice">??
    6. ????????<messageReceiver?class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>??
    7. ????</operation>??
    8. ????<operation?name="update">??
    9. ????????<messageReceiver?class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>??
    10. ????</operation>??
    11. ????<parameter?name="ServiceClass">samples.quickstart.service.axiom.StockQuoteService</parameter>??
    12. </service>??

    注意,幾乎是一樣的,除了操作是顯示地定義在service.xml文件中,而且MessageReceiver現(xiàn)在是RawXML。
    現(xiàn)在,上面提到的簡單的使用Axis2庫的類的StockQuoteService.java類,在Code Listing 5中定義。
    Code Listing 5:使用AXIOM的StockQuoteService類
    Java代碼
    1. package?samples.quickstart.service.axiom;??
    2. ??
    3. import?javax.xml.stream.XMLStreamException;??
    4. import?org.apache.axiom.om.OMAbstractFactory;??
    5. import?org.apache.axiom.om.OMElement;??
    6. import?org.apache.axiom.om.OMFactory;??
    7. import?org.apache.axiom.om.OMNamespace;??
    8. ??
    9. import?java.util.HashMap;??
    10. public?class?StockQuoteService?{??
    11. ????private?HashMap?map?=?new?HashMap();??
    12. ??
    13. ????public?OMElement?getPrice(OMElement?element)?throws?XMLStreamException?{??
    14. ????????element.build();??
    15. ????????element.detach();??
    16. ??
    17. ????????OMElement?symbolElement?=?element.getFirstElement();??
    18. ????????String?symbol?=?symbolElement.getText();??
    19. ??
    20. ????????String?returnText?=?"42";??
    21. ????????Double?price?=?(Double)?map.get(symbol);??
    22. ????????if(price?!=?null){??
    23. ????????????returnText??=?""?+?price.doubleValue();??
    24. ????????}??
    25. ????????OMFactory?fac?=?OMAbstractFactory.getOMFactory();??
    26. ????????OMNamespace?omNs?=??
    27. ????????????fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd",?"tns");??
    28. ????????OMElement?method?=?fac.createOMElement("getPriceResponse",?omNs);??
    29. ????????OMElement?value?=?fac.createOMElement("price",?omNs);??
    30. ????????value.addChild(fac.createOMText(value,?returnText));??
    31. ????????method.addChild(value);??
    32. ????????return?method;??
    33. ????}??
    34. ??
    35. ????public?void?update(OMElement?element)?throws?XMLStreamException?{??
    36. ????????element.build();??
    37. ????????element.detach();??
    38. ??
    39. ????????OMElement?symbolElement?=?element.getFirstElement();??
    40. ????????String?symbol?=?symbolElement.getText();??
    41. ??
    42. ????????OMElement?priceElement?=?(OMElement)symbolElement.getNextOMSibling();??
    43. ????????String?price?=?priceElement.getText();??
    44. ??
    45. ????????map.put(symbol,?new?Double(price));??
    46. ????}??
    47. }??

    Axis2使用AXIOM,或者AXIs Object Model,一個基于StAX API(Streaming API for XML)的DOM(Document Object Model)類似的結構
    作為服務的方法必須使用OMElement作為它們的參數(shù),OMElement表示一個XML元素,在這里它則為進來的SOAP消息的有效載荷。這里,
    你提取有效載荷元素的第一個孩子,添加文本給它,并使用它作為返回的OMElement的內容。除非這是一個"只有in"的服務,這些方法
    必須返回一個OMElement,因為它成為返回的SOAP消息的有效載荷。
    現(xiàn)在通過在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
    以及以下結構:
    http://localhost:8080/axis2/services/StockQuoteService?xsd

    使用ADB生成服務
    執(zhí)行以下步驟來使用Axis2 Databinding Framework(ADB)生成和部署服務。
    通過在Axis2_HOME/samples/quickstartadb目錄鍵入以下內容來使用WSDL2Java工具生成骨架:
    %AXIS2_HOME%/bin/WSDL2Java -uri resources/META-INF/StockQuoteService.wsdl -p samples.quickstart.adb -d adb -s -ss
    -sd -ssi -o build/service

    或者在Axis2_HOME/samples/quickstartadb目錄簡單的鍵入ant generate.service
    選項-d adb指定了Axis Data Binding(ADB)。-s轉換指定同步或者只模塊化調用。-ss轉換創(chuàng)建服務器端代碼(骨架和相關文件)。-sd
    轉換創(chuàng)建一個服務描述符(services.xml文件)。-ssi轉換為服務骨架創(chuàng)建一個接口。服務文件現(xiàn)在應該定位于build/service。
    如果你通過使用WSDL2Java直接生成代碼,下一步你需要修改生成的骨架來實現(xiàn)服務(如果你使用"ant generate.service",一個完全
    的骨架會自動復制并覆蓋生成的那個)。
    打開build/service/src/samples/quickstart/adb/service/StockQuoteServiceSkeleton.java文件并修改它來添加你的服務的功能性
    到生成的方法,下面的Code Listing 6顯示了。
    Code Listing 6:定義服務骨架文件
    Java代碼
    1. package?samples.quickstart.service.adb;??
    2. ??
    3. import?samples.quickstart.service.adb.xsd.GetPriceResponse;??
    4. import?samples.quickstart.service.adb.xsd.Update;??
    5. import?samples.quickstart.service.adb.xsd.GetPrice;??
    6. ??
    7. import?java.util.HashMap;??
    8. ??
    9. public?class?StockQuoteServiceSkeleton?{??
    10. ??
    11. ????private?static?HashMap?map;??
    12. ??
    13. ????static{?map?=?new?HashMap();?}??
    14. ??
    15. ????public?void?update(Update?param0)?{??
    16. ????????map.put(param0.getSymbol(),?new?Double(param0.getPrice()));??
    17. ????}??
    18. ??
    19. ????public?GetPriceResponse?getPrice(GetPrice?param1)?{??
    20. ????????Double?price?=?(Double)?map.get(param1.getSymbol());??
    21. ????????double?ret?=?42;??
    22. ????????if(price?!=?null){??
    23. ????????????ret?=?price.doubleValue();??
    24. ????????}??
    25. ????????GetPriceResponse?res?=??
    26. ????????????????new?GetPriceResponse();??
    27. ????????res.set_return(ret);??
    28. ????????return?res;??
    29. ????}??
    30. }??

    現(xiàn)在你可以通過在build/service目錄鍵入以下命令構建工程:ant jar.server
    如果一切進展順利,你應該在你的窗口看到BUILD SUCCESSFUL消息,而且StockQuoteService.aar文件在build/service/build/lib
    目錄中。復制該文件到servlet引擎的webapps/axis2/WEB-INF/services目錄。
    你可以通過視察下面的服務列表來確認服務正確部署:
    http://localhost:8080/axis2/services/listServices
    你也可以檢驗以下WSDL:
    http://localhost:8080/axis2/services/StockQuoteService?wsdl
    以及以下結構:
    http://localhost:8080/axis2/services/StockQuoteService?xsd

    使用XMLBeans生成服務
    執(zhí)行以下步驟來使用XMLBeans生成服務。
    通過在Axis2_HOME/samples/quickstartxmlbeans目錄鍵入以下命令來使用WSDL2Java工具生成骨架:
    %AXIS2_HOME%/bin/WSDL2Java -uri resources/META-INF/StockQuoteService.wsdl -p samples.quickstart.service.xmlbeans
    -d xmlbeans -s -ss -sd -ssi -o build/service

    或者在Axis2_HOME/sampels/quickstartxmlbeans目錄簡單的鍵入ant generate.service
    選項-d xmlbeans指定XMLBeans數(shù)據(jù)綁定。-s轉換指定同步或者只是模塊化調用。-ss轉換創(chuàng)建服務器端代碼(骨架和相關文件)。-sd
    轉換創(chuàng)建一個服務描述符(services.xml文件)。-ssi轉換創(chuàng)建一個服務骨架的接口。現(xiàn)在服務文件應該位于build/service。
    如果你通過使用WSDL2Java直接生成代碼,下一步你需要修改生成的骨架來實現(xiàn)服務(如果你使用"ant generate.service",一個完全
    的骨架將被自動復制并覆蓋生成的那個)。
    下一步打開build/service/src/samples/quickstart/service/xmlbeans/StockQuoteServiceSkeleton.java文件并修改它來添加你的
    服務的功能性到生成的方法(參看Code Listing 7)。
    Code Listing 7:定義服務骨架
    Java代碼
    1. package?samples.quickstart.service.xmlbeans;??
    2. ??
    3. import?samples.quickstart.service.xmlbeans.xsd.GetPriceDocument;??
    4. import?samples.quickstart.service.xmlbeans.xsd.GetPriceResponseDocument;??
    5. import?samples.quickstart.service.xmlbeans.xsd.UpdateDocument;??
    6. ??
    7. import?java.util.HashMap;??
    8. ??
    9. public?class?StockQuoteServiceSkeleton?implements?StockQuoteServiceSkeletonInterface?{??
    10. ??
    11. ????private?static?HashMap?map;??
    12. ??
    13. ????static{?map?=?new?HashMap();?}??
    14. ??
    15. ????public?void?update(UpdateDocument?param0)?{??
    16. ????}??
    17. ??
    18. ????public?GetPriceResponseDocument?getPrice(GetPriceDocument?param1)?{??
    19. ????}??
    20. }??

    通過在build/service目錄鍵入命令ant jar.server構建項目,該目錄包含build.xml文件。
    如果一切進展順利,你應該在你的窗口看到BUILD SUCCESSFUL消息,而且StockQuoteService.aar文件位于新創(chuàng)建的build/service/
    build/lib目錄。復制該文件到servlet引擎的webapps/axis2/WEB-INF/services目錄。
    你可以通過視察下面的服務列表來確認服務正確部署:
    http://localhost:8080/axis2/services/listServices
    你也可以檢驗以下WSDL:
    http://localhost:8080/axis2/services/StockQuoteService?wsdl
    以及以下結構:
    http://localhost:8080/axis2/services/StockQuoteService?xsd

    使用JiBX生成服務
    執(zhí)行以下步驟來使用JiBX數(shù)據(jù)綁定生成和部署服務。
    通過在Axis2_HOME/samples/quickstartjibx目錄的控制臺鍵入以下內容來使用WSDL2Java工具生成骨架:
    %AXIS2_HOME%/bin/wsdl2java -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數(shù)據(jù)綁定。-s轉換指定同步或者只是模塊化調用。-ss轉換創(chuàng)建服務器端代碼(骨架和相關文件)。-sd轉換創(chuàng)建
    一個服務描述符(services.xml文件)。-ssi轉換創(chuàng)建服務骨架的接口。-uw轉換解開傳遞給服務操作和從服務操作傳遞出去的參數(shù),來
    創(chuàng)建一個更自然的編程接口。
    在運行WSDL2Java后,服務文件應該位于build/service。如果你通過使用WSDL2Java直接生成代碼,下一步你需要修改生成的骨架來
    實現(xiàn)服務(如果你使用"ant generate.service"則一個完全的骨架將自動被復制并覆蓋生成的那個)。打開build/service/src/samples
    /quickstart/service/jibx/StockQuoteServiceSkeleton.java文件并修改它來添加你的服務的功能性到生成的方法,在Code Listing
    8中顯示了。
    Code Listing 8:定義服務骨架文件
    Java代碼
    1. package?samples.quickstart.service.jibx;??
    2. ??
    3. import?java.util.HashMap;??
    4. ??
    5. public?class?StockQuoteServiceSkeleton?implements?StockQuoteServiceSkeletonInterface?{??
    6. ????private?HashMap?map?=?new?HashMap();??
    7. ??
    8. ????public?void?update(String?symbol,?Double?price)?{??
    9. ????????map.put(symbol,?price);??
    10. ????}??
    11. ??
    12. ????public?Double?getPrice(String?symbol)?{??
    13. ????????Double?ret?=?(Double)?map.get(symbol);??
    14. ????????if?(ret?==?null)?{??
    15. ????????????ret?=?new?Double(42.0);??
    16. ????????}??
    17. ????????return?ret;??
    18. ????}??
    19. }??

    現(xiàn)在你可以通過在build/service目錄鍵入命令ant jar.server構建工程
    如果一切進展順利,你應該在你的窗口看到BUILD SUCCESSFUL消息,并且StockQuoteService.aar文件位于build/service/build/lib
    目錄。復制該文件到servlet引擎的webapps/axis2/WEB-INF/services目錄。
    你可以通過視察下面的服務列表來確認服務正確部署:
    http://localhost:8080/axis2/services/listServices
    你也可以檢驗以下WSDL:
    http://localhost:8080/axis2/services/StockQuoteService?wsdl
    以及以下結構:
    http://localhost:8080/axis2/services/StockQuoteService?xsd
    對于和Axis2使用JiBX的更多信息,參考[urlhttp://ws.apache.org/axis2/1_1_1/jibx/jibx-quotegen-integration.html]JiBX代碼生成集成[/url]。你也可以檢查JiBX Axis2 Wiki頁面得到更多同Axis2使用
    JiBX的更新信息。

    創(chuàng)建客戶端
    在這個部分,我們將看看基于StockQuoteService類創(chuàng)建客戶端的四種方式:構建基于AXIOM的客戶端,使用Axis2 Databinding Frame
    work(ADB)生成客戶端,使用XMLBeans生成客戶端,使用JiBX生成客戶端。

    使用AXIOM創(chuàng)建一個客戶端
    執(zhí)行以下步驟來使用AXIOM構建一個客戶端。
    也注意在使用AXIOM創(chuàng)建服務部分顯示的目錄結構,為了完整性下面的重復了。
    Java代碼
    1. -?quickstartaxiom??
    2. ???-?README.txt??
    3. ???-?build.xml??
    4. ???-?resources??
    5. ?????-?META-INF??
    6. ???????-?services.xml??
    7. ???????-?StockQuoteService.wsdl??
    8. ???-?src??
    9. ?????-?samples??
    10. ???????-?quickstart??
    11. ?????????-?service??
    12. ???????????-?axiom??
    13. ?????????????-?StockQuoteService.java??
    14. ?????????-?clients??
    15. ???????????-?AXIOMClient.java??

    上面提到的AXIOMClient.java類的定義顯示在下面的Code Listing 9。
    Code Listing 9:使用AXIOM的AXIOMClient類
    Java代碼
    1. package?samples.quickstart.clients;??
    2. ??
    3. import?org.apache.axiom.om.OMAbstractFactory;??
    4. import?org.apache.axiom.om.OMElement;??
    5. import?org.apache.axiom.om.OMFactory;??
    6. import?org.apache.axiom.om.OMNamespace;??
    7. import?org.apache.axis2.Constants;??
    8. import?org.apache.axis2.addressing.EndpointReference;??
    9. import?org.apache.axis2.client.Options;??
    10. import?org.apache.axis2.client.ServiceClient;??
    11. ??
    12. public?class?AXIOMClient?{??
    13. ??
    14. ????private?static?EndpointReference?targetEPR?=???
    15. ????????new?EndpointReference("http://localhost:8080/axis2/services/StockQuoteService");??
    16. ??
    17. ????public?static?OMElement?getPricePayload(String?symbol)?{??
    18. ????????OMFactory?fac?=?OMAbstractFactory.getOMFactory();??
    19. ????????OMNamespace?omNs?=?fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd",?"tns");??
    20. ??
    21. ????????OMElement?method?=?fac.createOMElement("getPrice",?omNs);??
    22. ????????OMElement?value?=?fac.createOMElement("symbol",?omNs);??
    23. ????????value.addChild(fac.createOMText(value,?symbol));??
    24. ????????method.addChild(value);??
    25. ????????return?method;??
    26. ????}??
    27. ??
    28. ????public?static?OMElement?updatePayload(String?symbol,?double?price)?{??
    29. ????????OMFactory?fac?=?OMAbstractFactory.getOMFactory();??
    30. ????????OMNamespace?omNs?=?fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd",?"tns");??
    31. ??
    32. ????????OMElement?method?=?fac.createOMElement("update",?omNs);??
    33. ??
    34. ????????OMElement?value1?=?fac.createOMElement("symbol",?omNs);??
    35. ????????value1.addChild(fac.createOMText(value1,?symbol));??
    36. ????????method.addChild(value1);??
    37. ??
    38. ????????OMElement?value2?=?fac.createOMElement("price",?omNs);??
    39. ????????value2.addChild(fac.createOMText(value2,??
    40. ?????????????????????????????????????????Double.toString(price)));??
    41. ????????method.addChild(value2);??
    42. ????????return?method;??
    43. ????}??
    44. ??
    45. ????public?static?void?main(String[]?args)?{??
    46. ????????try?{??
    47. ????????????OMElement?getPricePayload?=?getPricePayload("WSO");??
    48. ????????????OMElement?updatePayload?=?updatePayload("WSO",?123.42);??
    49. ????????????Options?options?=?new?Options();??
    50. ????????????options.setTo(targetEPR);??
    51. ????????????options.setTransportInProtocol(Constants.TRANSPORT_HTTP);??
    52. ??
    53. ????????????ServiceClient?sender?=?new?ServiceClient();??
    54. ????????????sender.setOptions(options);??
    55. ??
    56. ????????????sender.fireAndForget(updatePayload);??
    57. ????????????System.err.println("done");??
    58. ????????????OMElement?result?=?sender.sendReceive(getPricePayload);??
    59. ??
    60. ????????????String?response?=?result.getFirstElement().getText();??
    61. ????????????System.err.println("Current?price?of?WSO:?"?+?response);??
    62. ??
    63. ????????}?catch?(Exception?e)?{??
    64. ????????????e.printStackTrace();??
    65. ????????}??
    66. ????}??
    67. ??????
    68. }??

    Axis2使用AXIOM,或者AXIs Object Model,一個基于StAX API(Streaming API for XML)的DOM(Document Object Model)類似的結構
    這里你為服務的update和getPrice方法建立有效載荷。有效載荷的創(chuàng)建類似于你為AXIOM服務創(chuàng)建getPriceResponse有效載荷。然后
    你創(chuàng)建Options類,并創(chuàng)建用來與服務交流的ServiceClient。首先你調用update方法,一個什么也不返回的fireAndForget方法。最后
    你調用getPrice方法,并從服務得到當前價格并顯示它。
    現(xiàn)在你可以通過在Axis2_HOME/samples/quickstartaxiom目錄鍵入ant run.client構建并運行AXIOM客戶端。
    你應該得到以下輸出:
    Java代碼
    1. done??
    2. Current?price?of?WSO:?123.42??


    使用ADB生成一個客戶端
    執(zhí)行以下步驟來使用Axis Data Binding(ADB)構建一個客戶端。
    通過在Axis2_HOME/samples/quickstartadb目錄鍵入以下命令來生成客戶端數(shù)據(jù)綁定:
    %AXIS2_HOME%/bin/WSDL2Java -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,并看看它在Code Listing 10中是怎樣定義的。
    Code Listing 10:ADBClient類
    Java代碼
    1. package?samples.quickstart.clients;??
    2. ??
    3. import?samples.quickstart.service.adb.StockQuoteServiceStub;??
    4. ??
    5. public?class?ADBClient{??
    6. ????public?static?void?main(java.lang.String?args[]){??
    7. ????????try{??
    8. ????????????StockQuoteServiceStub?stub?=??
    9. ????????????????new?StockQuoteServiceStub??
    10. ????????????????("http://localhost:8080/axis2/services/StockQuoteService");??
    11. ??
    12. ????????????getPrice(stub);??
    13. ????????????update(stub);??
    14. ??
    15. ????????}?catch(Exception?e){??
    16. ????????????e.printStackTrace();??
    17. ????????????System.err.println("\n\n\n");??
    18. ????????}??
    19. ????}??
    20. ??
    21. ????/*?fire?and?forget?*/??
    22. ????public?static?void?update(StockQuoteServiceStub?stub){??
    23. ????????try{??
    24. ????????????StockQuoteServiceStub.Update?req?=?new?StockQuoteServiceStub.Update();??
    25. ????????????req.setSymbol?("ABC");??
    26. ????????????req.setPrice?(42.35);??
    27. ??
    28. ????????????stub.update(req);??
    29. ????????????System.err.println("done");??
    30. ????????}?catch(Exception?e){??
    31. ????????????e.printStackTrace();??
    32. ????????????System.err.println("\n\n\n");??
    33. ????????}??
    34. ????}??
    35. ??
    36. ????/*?two?way?call/receive?*/??
    37. ????public?static?void?getPrice(StockQuoteServiceStub?stub){??
    38. ????????try{??
    39. ????????????StockQuoteServiceStub.GetPrice?req?=?new?StockQuoteServiceStub.GetPrice();??
    40. ??
    41. ????????????req.setSymbol("ABC");??
    42. ??
    43. ????????????StockQuoteServiceStub.GetPriceResponse?res?=??
    44. ????????????????stub.getPrice(req);??
    45. ??
    46. ????????????System.err.println(res.get_return());??
    47. ????????}?catch(Exception?e){??
    48. ????????????e.printStackTrace();??
    49. ????????????System.err.println("\n\n\n");??
    50. ????????}??
    51. ????}??
    52. ??
    53. }??

    該類使用你創(chuàng)建的Axis Data Bindings創(chuàng)建一個客戶端存根。然后它在Web服務上調用getPrice和update操作。getPrice方法操作創(chuàng)建
    GetPrice有效載荷并設置symbol為ABC。然后它發(fā)送請求并顯示當前價格。update方法創(chuàng)建一個Update有效載荷,設置symbol為ABC及
    price為42.35。
    現(xiàn)在通過在Axis2_HOME/samples/quickstartadb目錄鍵入ant run.client來構建并運行客戶端。
    你應該得到以下輸出:
    Java代碼
    1. 42??
    2. done??


    使用XMLBeans生成一個客戶端
    執(zhí)行以下步驟來使用XMLBeans數(shù)據(jù)綁定來構建一個客戶端。
    通過在xmlbeansClient目錄鍵入以下命令來生成數(shù)據(jù)綁定:
    %AXIS2_HOME%/bin/WSDL2Java -uri resources/META-INF/StockQuoteService.wsdl -p samples.quickstart.service.xmlbeans -d
    xmlbeans -s -o build/client

    或者簡單的在Axis2_HOME/samples/quickstartxmlbeans目錄下鍵入ant generate.client
    注意這只會創(chuàng)建客戶端存根代碼而不會創(chuàng)建服務器端代碼。
    下一步看看quickstartxmlbeans/src/samples/quickstart/clients/XMLBEANSClient.java,并在Code Listing 11看看它怎樣定義的
    Code Listing 11:XMLBEANSClient類
    Java代碼
    1. package?samples.quickstart.clients;??
    2. ??
    3. import?samples.quickstart.service.xmlbeans.StockQuoteServiceStub;??
    4. import?samples.quickstart.service.xmlbeans.xsd.GetPriceDocument;??
    5. import?samples.quickstart.service.xmlbeans.xsd.GetPriceResponseDocument;??
    6. import?samples.quickstart.service.xmlbeans.xsd.UpdateDocument;??
    7. ??
    8. public?class?XMLBEANSClient{??
    9. ??
    10. ????public?static?void?main(java.lang.String?args[]){??
    11. ????????try{??
    12. ????????????StockQuoteServiceStub?stub?=??
    13. ????????????????new?StockQuoteServiceStub??
    14. ????????????????("http://localhost:8080/axis2/services/StockQuoteService");??
    15. ??
    16. ????????????getPrice(stub);??
    17. ????????????update(stub);??
    18. ??
    19. ????????}?catch(Exception?e){??
    20. ????????????e.printStackTrace();??
    21. ????????????System.err.println("\n\n\n");??
    22. ????????}??
    23. ????}??
    24. ??
    25. ????/*?fire?and?forget?*/??
    26. ????public?static?void?update(StockQuoteServiceStub?stub){??
    27. ????????try{??
    28. ????????????UpdateDocument?reqDoc?=?UpdateDocument.Factory.newInstance();??
    29. ????????????UpdateDocument.Update?req?=?reqDoc.addNewUpdate();??
    30. ????????????req.setSymbol?("ABC");??
    31. ????????????req.setPrice?(42.32);??
    32. ??
    33. ????????????stub.update(reqDoc);??
    34. ????????????System.err.println("done");??
    35. ????????}?catch(Exception?e){??
    36. ????????????e.printStackTrace();??
    37. ????????????System.err.println("\n\n\n");??
    38. ????????}??
    39. ????}??
    40. ??
    41. ????/*?two?way?call/receive?*/??
    42. ????public?static?void?getPrice(StockQuoteServiceStub?stub){??
    43. ????????try{??
    44. ????????????GetPriceDocument?reqDoc?=?GetPriceDocument.Factory.newInstance();??
    45. ????????????GetPriceDocument.GetPrice?req?=?reqDoc.addNewGetPrice();??
    46. ????????????req.setSymbol("ABC");??
    47. ??
    48. ????????????GetPriceResponseDocument?res?=??
    49. ????????????????stub.getPrice(reqDoc);??
    50. ??
    51. ????????????System.err.println(res.getGetPriceResponse().getReturn());??
    52. ????????}?catch(Exception?e){??
    53. ????????????e.printStackTrace();??
    54. ????????????System.err.println("\n\n\n");??
    55. ????????}??
    56. ????}??
    57. }??

    該類使用你創(chuàng)建的XMLBeans數(shù)據(jù)綁定創(chuàng)建一個客戶端存根,然后它在Web服務上調用getPrice和update操作。getPrice方法操作創(chuàng)建
    GetPriceDocument,它內部的GetPrice類,并設置symbol為ABC。然后它發(fā)送請求并得到GetPriceResponseDocument并顯示當前price
    update方法創(chuàng)建一個UpdateDocument和Update并設置symbol為ABC及price為42.32,當完成時顯示done。
    現(xiàn)在通過在Axis2_HOME/samples/quickstartxmlbeans目錄鍵入ant run.client構建并運行工程。
    你應該得到下列輸出:
    Java代碼
    1. 42??
    2. done??


    使用JiBX生成一個客戶端
    執(zhí)行以下步驟來使用JiBX構建一個客戶端。
    通過在Axis2_HOME/samples/quickstartjibx目錄的控制臺鍵入以下命令來生成客戶端存根:
    Java代碼
    1. %AXIS2_HOME%/bin/wsdl2java?-uri?resources/META-INF/StockQuoteService.wsdl?-p?samples.quickstart.clients?-d?jibx?-s??
    2. -uw?-o?build/client??

    或者簡單的鍵入"ant generate.client"。
    下一步看看quickstartjibx/src/samples/quickstart/clients/JiBXClient.java,在Code Listing 12顯示了。
    Code Listing 12:JiBXClient類
    Java代碼
    1. package?samples.quickstart.clients;??
    2. ??
    3. import?samples.quickstart.service.jibx.StockQuoteServiceStub;??
    4. ??
    5. public?class?JiBXClient{??
    6. ????public?static?void?main(java.lang.String?args[]){??
    7. ????????try{??
    8. ????????????StockQuoteServiceStub?stub?=??
    9. ????????????????new?StockQuoteServiceStub??
    10. ????????????????("http://localhost:8080/axis2/services/StockQuoteService");??
    11. ??
    12. ????????????getPrice(stub);??
    13. ????????????update(stub);??
    14. ??
    15. ????????}?catch(Exception?e){??
    16. ????????????e.printStackTrace();??
    17. ????????????System.err.println("\n\n\n");??
    18. ????????}??
    19. ????}??
    20. ??
    21. ????/*?fire?and?forget?*/??
    22. ????public?static?void?update(StockQuoteServiceStub?stub){??
    23. ????????try{??
    24. ????????????stub.update("ABC",?new?Double(42.35));??
    25. ????????????System.err.println("done");??
    26. ????????}?catch(Exception?e){??
    27. ????????????e.printStackTrace();??
    28. ????????????System.err.println("\n\n\n");??
    29. ????????}??
    30. ????}??
    31. ??
    32. ????/*?two?way?call/receive?*/??
    33. ????public?static?void?getPrice(StockQuoteServiceStub?stub){??
    34. ????????try{??
    35. ????????????System.err.println(stub.getPrice("ABC"));??
    36. ????????}?catch(Exception?e){??
    37. ????????????e.printStackTrace();??
    38. ????????????System.err.println("\n\n\n");??
    39. ????????}??
    40. ????}??
    41. ??
    42. }??

    該類使用創(chuàng)建的JiBX客戶端存根在Web服務上訪問getPrice和update操作。getPrice方法為股票"ABC"發(fā)送請求并顯示當前price。
    update方法為股票"ABC"設置價格為42.35。
    現(xiàn)在通過在Axis2_HOME/samples/quickstartjibx目錄的控制臺鍵入"[b]ant run.client[b]"來構建并運行客戶端。
    你應該得到以下輸出:
    Java代碼
    1. 42??
    2. done??

    參考JiBX代碼生成集成來得到更多關于同Axis2使用JiBX的信息細節(jié)。

    總結
    Axis2是一個立刻讓web服務運行起來的靈活和健壯的方式。本指南呈現(xiàn)了創(chuàng)建一個可以在Axis2上部署的服務的五種方法。現(xiàn)在你擁有
    了使用多種不同技術來創(chuàng)建Web服務的靈活性。

    進一步學習
    Apache Axis2-http://ws.apache.org/axis2/
    Axis2 Architecture-http://ws.apache.org/axis2/1_0/Axis2ArchitectureGuide.html
    Introduction to Apache Axis2-http://www.redhat.com/magazine/021jul06/features/apache_axis2/
    Working With Apache Axis2-http://www.wso2.net/articles/axis2/java/2006/09/13/working-with-axis2
    posted on 2009-07-14 17:11 禮物 閱讀(415) 評論(0)  編輯  收藏 所屬分類: Axis
    主站蜘蛛池模板: 亚洲人成人网站在线观看| 国产午夜精品久久久久免费视 | 久久久久亚洲AV无码专区体验| 精品国产亚洲第一区二区三区| 无码少妇一区二区浪潮免费| 亚洲一级在线观看| 亚欧免费视频一区二区三区| 亚洲国产美女精品久久久久| 国产曰批免费视频播放免费s| 亚洲国产精品成人精品软件| 日本XXX黄区免费看| 欧洲 亚洲 国产图片综合| 女人18毛片免费观看| 亚洲精品久久无码av片俺去也| 免费无码又爽又刺激毛片| 亚洲av午夜电影在线观看| 免费在线观看理论片| v片免费在线观看| 亚洲欧洲自拍拍偷精品 美利坚| selaoban在线视频免费精品| 国产成人精品日本亚洲专区| 全黄大全大色全免费大片| 自怕偷自怕亚洲精品| 女人18毛片a级毛片免费视频| 色哟哟国产精品免费观看| 亚洲国产综合无码一区| 精品无码免费专区毛片| 亚洲a∨无码一区二区| 亚洲一区二区女搞男| h视频在线观看免费完整版| 亚洲AV无码资源在线观看| 国产亚洲精品国看不卡| 2021在线观看视频精品免费| 亚洲sm另类一区二区三区| 亚洲色婷婷六月亚洲婷婷6月| 免费黄色福利视频| 免费看一级高潮毛片| 亚洲最新永久在线观看| 国产精品免费综合一区视频| 成人性做爰aaa片免费看| 国内精品久久久久影院亚洲|