原文鏈接:http://ws.apache.org/axis2/1_1_1/quickstartguide.html
本指南的目的是讓你盡可能快的創(chuàng)建使用Axis2的服務(wù)和客戶端,我們將使用一個(gè)簡單的StockQuote服務(wù)并顯示給你一些創(chuàng)建和部署它
的不同的方式,以及快速的看看Axis2自帶的一些工具,然后我們將看看創(chuàng)建訪問這些服務(wù)的客戶端。
內(nèi)容
快速安裝筆記:
文檔的代碼可以在解壓的標(biāo)準(zhǔn)二進(jìn)制發(fā)布[/url]找到,更明確的位于其中的Axis2_HOME/samples/目錄-quickstart,quickstartdb,
quickstartaxiom,quickstartjibx和quickstartxmlbeans,如果你繼續(xù)下去它將幫你掌握它。它包含一個(gè)Ant構(gòu)建文件(build.xml)
貫穿所有的例子我們將提到它來使得編譯更容易。
介紹
讓我們以服務(wù)本身開始。我們將使它簡單,所以你可以看到當(dāng)我們構(gòu)建并部署服務(wù)時(shí)會發(fā)生什么,一個(gè)StockQuoteService例子看起來
像這個(gè),所以讓我們使用下面的(參看Code Listing 1)。
Code Listing 1: StockQuoteService類
它將為一個(gè)具有兩個(gè)可能的調(diào)用的簡單服務(wù),其中一個(gè)是一個(gè)in/out消息,另一個(gè)則為一個(gè)只能in的服務(wù),最終我們將打包服務(wù)并用
四種不同的方式部署部署它。
首先,讓我們看看這個(gè)簡單的Java類怎樣響應(yīng)一個(gè)服務(wù)。
做好準(zhǔn)備
在我們使用Axis2構(gòu)建任何東西之前,我們將需要關(guān)注一些家務(wù)事。現(xiàn)在你將需要準(zhǔn)備好你使用Axis2的環(huán)境,幸運(yùn)的是,它只包括一
些簡單的步驟:
1,下載并安裝Java(版本至少為JDK1.4)
2,下載Axis2并解壓到一個(gè)目標(biāo)目錄
3,復(fù)制axis2.war文件到你的servlet引擎的webapps目錄
4,設(shè)置AXIS2_HOME環(huán)境變量來指出目標(biāo)目錄,注意Axis2生成的所有腳本和構(gòu)建文件依賴于這個(gè)值,所以不要遺漏了這個(gè)步驟。
大多數(shù)情況下,我們的服務(wù)也將需要一個(gè)WSDL文件,Axis2的Java2WSDL可以用來生成一個(gè)WSDL。執(zhí)行以下步驟來從一個(gè)Java類生成一
個(gè)WSDL文件:
1,創(chuàng)建并編譯Java類
2,使用該命令生成WSDL:
%AXIS2_HOME%/bin/java2wsdl -cp . -cn samples.quickstart.service.pojo.StockQuoteService -of StockQuoteService.wsdl
移動(dòng)你生成WSDL文件,你可以做你需要的任何更改。例如,你可能添加自定義的過錯(cuò)或者改變生成的元素名。例如,該StockQuoteSer
vice.wsdl位于%AXIS2_HOME%/samples/quickstartadb/resources/META-INF文件夾,我們將在本指南的其他部分使用它,代替生成過
程創(chuàng)建的一般參數(shù)。
Axis2服務(wù)
在我們構(gòu)建任何東西之前,理解最終產(chǎn)品看起來像什么是有用的。Axis2的服務(wù)器端可以被部署在任何Servlet引擎上,并且有如下的
Code Listing 2顯示的結(jié)構(gòu)。
Code Listing 2: axis2.war的目錄結(jié)構(gòu)
從最上面開始,axis2-web是組成Axis2管理程序的一些JSPs,你可以通過它來執(zhí)行任何需要的動(dòng)作,例如添加服務(wù),使用模塊和禁止
模塊。WEB-INF包含了運(yùn)行部署到服務(wù)目錄的任何服務(wù)的實(shí)際上的java類和其他支持文件。
這里主要的文件是axis2.xml,它控制程序怎樣與接收的消息打交道,決定Axis2是否需要使用模塊目錄里定義的任何模塊。
這里你可以看到,服務(wù)可以被部署為*.aar文件,但是它們的內(nèi)容必須以一個(gè)特殊的方式安排。例如,服務(wù)的結(jié)構(gòu)將為如下:
這不是太復(fù)雜,服務(wù)的名字為StockQuoteService,它在services.xml中指定,并且根據(jù)包名把任何Java類放到合適的位置。META-INF
目錄包含關(guān)于Axis2需要來正確執(zhí)行服務(wù)的額外信息。services.xml文件定義了服務(wù)本身并把Java類鏈接到它(參看Code Listing 3)。
Code Listing 3: 服務(wù)定義文件
這里你看到服務(wù)本身被定義了,以及不同的消息交換模式相關(guān)的messageReceiver類型。
META-INF目錄也是你打算包含在該程序中的自定義WSDL文件的位置。
你可以通過簡單的采用該文件目錄結(jié)構(gòu)并復(fù)制到你的servlet引擎的webapps目錄來部署一個(gè)服務(wù),這是著名的"爆發(fā)"形式,但是你也
可以壓縮你的文檔到一個(gè)*.aar文件,類似于一個(gè)*.jar文件,并直接將*.aar文件放到servlet引擎的webapps目錄。
既然你理解了我們在嘗試完成什么,我們幾乎準(zhǔn)備好開始構(gòu)建了。
首先,下載并解壓合適版本的Axis2標(biāo)準(zhǔn)二進(jìn)制發(fā)布。確認(rèn)你設(shè)置了AXIS2_HOME變量的值來匹配你解壓該版本內(nèi)容的位置。
讓我們看看一些創(chuàng)建客戶端和服務(wù)的不同方式。
創(chuàng)建服務(wù)
在這個(gè)部分,我們將看看根據(jù)StockQuoteService類創(chuàng)建服務(wù)的五種方式:部署Plain Old Java Objects(POJO),使用AXIOM的OMElement
構(gòu)建服務(wù),使用Axis2 Databinding Framework(ADB)生成服務(wù),使用XMLBeans生成服務(wù)和使用JiBX生成服務(wù)。
部署POJOs
使用POJOs(Plain Old Java Objects)來部署服務(wù),執(zhí)行下面的步驟。
注意包含在<AXIS2_HOME>/samples/quickstart的目錄結(jié)構(gòu)(services.xml文件來自于該指南的第一個(gè)部分):
注意你可以通過在quickstart目錄鍵入ant generate.wsdl來生成WSDL。
盡管如此,創(chuàng)建StockQuoteService.wsdl是可選的。它可以是直接從Java類生成的版本,或者該文件的一個(gè)自定義版本,并且servi
ces.xml是本文檔前面提到的同一文件。
現(xiàn)在通過在quickstart目錄鍵入ant generate.service來構(gòu)建工程,該目錄創(chuàng)建了以下目錄結(jié)構(gòu):
如果你想以爆發(fā)形式部署服務(wù),重命名classes目錄為StockQuoteService,并復(fù)制它到你的servlet引擎的webapps/axis2/WEB-INF/s
ervices目錄。否則,復(fù)制build/StockQuoteService.aar文件到你的servlet引擎的webapps/axis2/WEB-INF/services目錄。然后通過
視察以下服務(wù)列表來確認(rèn)服務(wù)被正確部署:
http://localhost:8080/axis2/services/listServices
你也可以檢驗(yàn)以下WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
以及以下結(jié)構(gòu):
http://localhost:8080/axis2/services/StockQuoteService?xsd
一旦這些urls工作,讓我們快速測試一下服務(wù)。讓你的瀏覽器訪問以下URL試試:
http://localhost:8080/axis2/rest/StockQuoteService/getPrice?symbol=IBM
你將得到如下應(yīng)答:
如果你像這樣調(diào)用update方法:
http://localhost:8080/axis2/rest/StockQuoteService/update?symbol=IBM&price=100
然后調(diào)用第一個(gè)getPrice url。你可以看到price被更新了。
使用AXIOM構(gòu)建服務(wù)
為了使用AXIOM"從零開始"構(gòu)建一個(gè)服務(wù),執(zhí)行以下步驟。
注意包含在/samples/quickstartaxiom的目錄結(jié)構(gòu):
由于AXIOM有一點(diǎn)不同,你將需要一個(gè)與POJO所用不同的services.xml文件,在Code Listing 4中顯示了它的定義。
Code Listing 4: 服務(wù)定義文件
注意,幾乎是一樣的,除了操作是顯示地定義在service.xml文件中,而且MessageReceiver現(xiàn)在是RawXML。
現(xiàn)在,上面提到的簡單的使用Axis2庫的類的StockQuoteService.java類,在Code Listing 5中定義。
Code Listing 5:使用AXIOM的StockQuoteService類
Axis2使用AXIOM,或者AXIs Object Model,一個(gè)基于StAX API(Streaming API for XML)的DOM(Document Object Model)類似的結(jié)構(gòu)
作為服務(wù)的方法必須使用OMElement作為它們的參數(shù),OMElement表示一個(gè)XML元素,在這里它則為進(jìn)來的SOAP消息的有效載荷。這里,
你提取有效載荷元素的第一個(gè)孩子,添加文本給它,并使用它作為返回的OMElement的內(nèi)容。除非這是一個(gè)"只有in"的服務(wù),這些方法
必須返回一個(gè)OMElement,因?yàn)樗蔀榉祷氐腟OAP消息的有效載荷。
現(xiàn)在通過在Axis2_HOME/samples/quickstartaxiom目錄鍵入ant generate.service來構(gòu)建工程。
把StockQuoteService.aar文件放在servlet引擎的webapps/axis2/WEB-INF/services目錄,通過視察下面的服務(wù)列表來確認(rèn)服務(wù)正確
部署:
http://localhost:8080/axis2/services/listServices
你也可以檢驗(yàn)以下WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
以及以下結(jié)構(gòu):
http://localhost:8080/axis2/services/StockQuoteService?xsd
使用ADB生成服務(wù)
執(zhí)行以下步驟來使用Axis2 Databinding Framework(ADB)生成和部署服務(wù)。
通過在Axis2_HOME/samples/quickstartadb目錄鍵入以下內(nèi)容來使用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
選項(xiàng)-d adb指定了Axis Data Binding(ADB)。-s轉(zhuǎn)換指定同步或者只模塊化調(diào)用。-ss轉(zhuǎn)換創(chuàng)建服務(wù)器端代碼(骨架和相關(guān)文件)。-sd
轉(zhuǎn)換創(chuàng)建一個(gè)服務(wù)描述符(services.xml文件)。-ssi轉(zhuǎn)換為服務(wù)骨架創(chuàng)建一個(gè)接口。服務(wù)文件現(xiàn)在應(yīng)該定位于build/service。
如果你通過使用WSDL2Java直接生成代碼,下一步你需要修改生成的骨架來實(shí)現(xiàn)服務(wù)(如果你使用"ant generate.service",一個(gè)完全
的骨架會自動(dòng)復(fù)制并覆蓋生成的那個(gè))。
打開build/service/src/samples/quickstart/adb/service/StockQuoteServiceSkeleton.java文件并修改它來添加你的服務(wù)的功能性
到生成的方法,下面的Code Listing 6顯示了。
Code Listing 6:定義服務(wù)骨架文件
現(xiàn)在你可以通過在build/service目錄鍵入以下命令構(gòu)建工程:ant jar.server
如果一切進(jìn)展順利,你應(yīng)該在你的窗口看到BUILD SUCCESSFUL消息,而且StockQuoteService.aar文件在build/service/build/lib
目錄中。復(fù)制該文件到servlet引擎的webapps/axis2/WEB-INF/services目錄。
你可以通過視察下面的服務(wù)列表來確認(rèn)服務(wù)正確部署:
http://localhost:8080/axis2/services/listServices
你也可以檢驗(yàn)以下WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
以及以下結(jié)構(gòu):
http://localhost:8080/axis2/services/StockQuoteService?xsd
使用XMLBeans生成服務(wù)
執(zhí)行以下步驟來使用XMLBeans生成服務(wù)。
通過在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
選項(xiàng)-d xmlbeans指定XMLBeans數(shù)據(jù)綁定。-s轉(zhuǎn)換指定同步或者只是模塊化調(diào)用。-ss轉(zhuǎn)換創(chuàng)建服務(wù)器端代碼(骨架和相關(guān)文件)。-sd
轉(zhuǎn)換創(chuàng)建一個(gè)服務(wù)描述符(services.xml文件)。-ssi轉(zhuǎn)換創(chuàng)建一個(gè)服務(wù)骨架的接口。現(xiàn)在服務(wù)文件應(yīng)該位于build/service。
如果你通過使用WSDL2Java直接生成代碼,下一步你需要修改生成的骨架來實(shí)現(xiàn)服務(wù)(如果你使用"ant generate.service",一個(gè)完全
的骨架將被自動(dòng)復(fù)制并覆蓋生成的那個(gè))。
下一步打開build/service/src/samples/quickstart/service/xmlbeans/StockQuoteServiceSkeleton.java文件并修改它來添加你的
服務(wù)的功能性到生成的方法(參看Code Listing 7)。
Code Listing 7:定義服務(wù)骨架
通過在build/service目錄鍵入命令ant jar.server構(gòu)建項(xiàng)目,該目錄包含build.xml文件。
如果一切進(jìn)展順利,你應(yīng)該在你的窗口看到BUILD SUCCESSFUL消息,而且StockQuoteService.aar文件位于新創(chuàng)建的build/service/
build/lib目錄。復(fù)制該文件到servlet引擎的webapps/axis2/WEB-INF/services目錄。
你可以通過視察下面的服務(wù)列表來確認(rèn)服務(wù)正確部署:
http://localhost:8080/axis2/services/listServices
你也可以檢驗(yàn)以下WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
以及以下結(jié)構(gòu):
http://localhost:8080/axis2/services/StockQuoteService?xsd
使用JiBX生成服務(wù)
執(zhí)行以下步驟來使用JiBX數(shù)據(jù)綁定生成和部署服務(wù)。
通過在Axis2_HOME/samples/quickstartjibx目錄的控制臺鍵入以下內(nèi)容來使用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"
選項(xiàng)-d jibx指定了JiBX數(shù)據(jù)綁定。-s轉(zhuǎn)換指定同步或者只是模塊化調(diào)用。-ss轉(zhuǎn)換創(chuàng)建服務(wù)器端代碼(骨架和相關(guān)文件)。-sd轉(zhuǎn)換創(chuàng)建
一個(gè)服務(wù)描述符(services.xml文件)。-ssi轉(zhuǎn)換創(chuàng)建服務(wù)骨架的接口。-uw轉(zhuǎn)換解開傳遞給服務(wù)操作和從服務(wù)操作傳遞出去的參數(shù),來
創(chuàng)建一個(gè)更自然的編程接口。
在運(yùn)行WSDL2Java后,服務(wù)文件應(yīng)該位于build/service。如果你通過使用WSDL2Java直接生成代碼,下一步你需要修改生成的骨架來
實(shí)現(xiàn)服務(wù)(如果你使用"ant generate.service"則一個(gè)完全的骨架將自動(dòng)被復(fù)制并覆蓋生成的那個(gè))。打開build/service/src/samples
/quickstart/service/jibx/StockQuoteServiceSkeleton.java文件并修改它來添加你的服務(wù)的功能性到生成的方法,在Code Listing
8中顯示了。
Code Listing 8:定義服務(wù)骨架文件
現(xiàn)在你可以通過在build/service目錄鍵入命令ant jar.server構(gòu)建工程
如果一切進(jìn)展順利,你應(yīng)該在你的窗口看到BUILD SUCCESSFUL消息,并且StockQuoteService.aar文件位于build/service/build/lib
目錄。復(fù)制該文件到servlet引擎的webapps/axis2/WEB-INF/services目錄。
你可以通過視察下面的服務(wù)列表來確認(rèn)服務(wù)正確部署:
http://localhost:8080/axis2/services/listServices
你也可以檢驗(yàn)以下WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
以及以下結(jié)構(gòu):
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)建客戶端
在這個(gè)部分,我們將看看基于StockQuoteService類創(chuàng)建客戶端的四種方式:構(gòu)建基于AXIOM的客戶端,使用Axis2 Databinding Frame
work(ADB)生成客戶端,使用XMLBeans生成客戶端,使用JiBX生成客戶端。
使用AXIOM創(chuàng)建一個(gè)客戶端
執(zhí)行以下步驟來使用AXIOM構(gòu)建一個(gè)客戶端。
也注意在使用AXIOM創(chuàng)建服務(wù)部分顯示的目錄結(jié)構(gòu),為了完整性下面的重復(fù)了。
上面提到的AXIOMClient.java類的定義顯示在下面的Code Listing 9。
Code Listing 9:使用AXIOM的AXIOMClient類
Axis2使用AXIOM,或者AXIs Object Model,一個(gè)基于StAX API(Streaming API for XML)的DOM(Document Object Model)類似的結(jié)構(gòu)
這里你為服務(wù)的update和getPrice方法建立有效載荷。有效載荷的創(chuàng)建類似于你為AXIOM服務(wù)創(chuàng)建getPriceResponse有效載荷。然后
你創(chuàng)建Options類,并創(chuàng)建用來與服務(wù)交流的ServiceClient。首先你調(diào)用update方法,一個(gè)什么也不返回的fireAndForget方法。最后
你調(diào)用getPrice方法,并從服務(wù)得到當(dāng)前價(jià)格并顯示它。
現(xiàn)在你可以通過在Axis2_HOME/samples/quickstartaxiom目錄鍵入ant run.client構(gòu)建并運(yùn)行AXIOM客戶端。
你應(yīng)該得到以下輸出:
使用ADB生成一個(gè)客戶端
執(zhí)行以下步驟來使用Axis Data Binding(ADB)構(gòu)建一個(gè)客戶端。
通過在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類
該類使用你創(chuàng)建的Axis Data Bindings創(chuàng)建一個(gè)客戶端存根。然后它在Web服務(wù)上調(diào)用getPrice和update操作。getPrice方法操作創(chuàng)建
GetPrice有效載荷并設(shè)置symbol為ABC。然后它發(fā)送請求并顯示當(dāng)前價(jià)格。update方法創(chuàng)建一個(gè)Update有效載荷,設(shè)置symbol為ABC及
price為42.35。
現(xiàn)在通過在Axis2_HOME/samples/quickstartadb目錄鍵入ant run.client來構(gòu)建并運(yùn)行客戶端。
你應(yīng)該得到以下輸出:
使用XMLBeans生成一個(gè)客戶端
執(zhí)行以下步驟來使用XMLBeans數(shù)據(jù)綁定來構(gòu)建一個(gè)客戶端。
通過在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)建服務(wù)器端代碼。
下一步看看quickstartxmlbeans/src/samples/quickstart/clients/XMLBEANSClient.java,并在Code Listing 11看看它怎樣定義的
Code Listing 11:XMLBEANSClient類
該類使用你創(chuàng)建的XMLBeans數(shù)據(jù)綁定創(chuàng)建一個(gè)客戶端存根,然后它在Web服務(wù)上調(diào)用getPrice和update操作。getPrice方法操作創(chuàng)建
GetPriceDocument,它內(nèi)部的GetPrice類,并設(shè)置symbol為ABC。然后它發(fā)送請求并得到GetPriceResponseDocument并顯示當(dāng)前price
update方法創(chuàng)建一個(gè)UpdateDocument和Update并設(shè)置symbol為ABC及price為42.32,當(dāng)完成時(shí)顯示done。
現(xiàn)在通過在Axis2_HOME/samples/quickstartxmlbeans目錄鍵入ant run.client構(gòu)建并運(yùn)行工程。
你應(yīng)該得到下列輸出:
使用JiBX生成一個(gè)客戶端
執(zhí)行以下步驟來使用JiBX構(gòu)建一個(gè)客戶端。
通過在Axis2_HOME/samples/quickstartjibx目錄的控制臺鍵入以下命令來生成客戶端存根:
或者簡單的鍵入"ant generate.client"。
下一步看看quickstartjibx/src/samples/quickstart/clients/JiBXClient.java,在Code Listing 12顯示了。
Code Listing 12:JiBXClient類
該類使用創(chuàng)建的JiBX客戶端存根在Web服務(wù)上訪問getPrice和update操作。getPrice方法為股票"ABC"發(fā)送請求并顯示當(dāng)前price。
update方法為股票"ABC"設(shè)置價(jià)格為42.35。
現(xiàn)在通過在Axis2_HOME/samples/quickstartjibx目錄的控制臺鍵入"[b]ant run.client[b]"來構(gòu)建并運(yùn)行客戶端。
你應(yīng)該得到以下輸出:
參考JiBX代碼生成集成來得到更多關(guān)于同Axis2使用JiBX的信息細(xì)節(jié)。
總結(jié)
Axis2是一個(gè)立刻讓web服務(wù)運(yùn)行起來的靈活和健壯的方式。本指南呈現(xiàn)了創(chuàng)建一個(gè)可以在Axis2上部署的服務(wù)的五種方法。現(xiàn)在你擁有
了使用多種不同技術(shù)來創(chuàng)建Web服務(wù)的靈活性。
進(jìn)一步學(xué)習(xí)
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
本指南的目的是讓你盡可能快的創(chuàng)建使用Axis2的服務(wù)和客戶端,我們將使用一個(gè)簡單的StockQuote服務(wù)并顯示給你一些創(chuàng)建和部署它
的不同的方式,以及快速的看看Axis2自帶的一些工具,然后我們將看看創(chuàng)建訪問這些服務(wù)的客戶端。
內(nèi)容
- 介紹??
- 做好準(zhǔn)備??
- Axis2服務(wù)??
- 創(chuàng)建服務(wù)??
- ????部署POJOs??
- ????使用AXIOM構(gòu)建服務(wù)??
- ????使用ADB生成服務(wù)??
- ????使用XMLBeans生成服務(wù)??
- ????使用JiBX生成服務(wù)??
- 生成客戶端??
- ????使用AXIOM創(chuàng)建一個(gè)客戶端??
- ????使用ADB生成一個(gè)客戶端??
- ????使用XMLBeans生成一個(gè)客戶端??
- ????使用JiBX生成一個(gè)客戶端??
- 總結(jié)??
- 進(jìn)一步學(xué)習(xí)??
快速安裝筆記:
文檔的代碼可以在解壓的標(biāo)準(zhǔn)二進(jìn)制發(fā)布[/url]找到,更明確的位于其中的Axis2_HOME/samples/目錄-quickstart,quickstartdb,
quickstartaxiom,quickstartjibx和quickstartxmlbeans,如果你繼續(xù)下去它將幫你掌握它。它包含一個(gè)Ant構(gòu)建文件(build.xml)
貫穿所有的例子我們將提到它來使得編譯更容易。
介紹
讓我們以服務(wù)本身開始。我們將使它簡單,所以你可以看到當(dāng)我們構(gòu)建并部署服務(wù)時(shí)會發(fā)生什么,一個(gè)StockQuoteService例子看起來
像這個(gè),所以讓我們使用下面的(參看Code Listing 1)。
Code Listing 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));??
- ????}??
- }??
它將為一個(gè)具有兩個(gè)可能的調(diào)用的簡單服務(wù),其中一個(gè)是一個(gè)in/out消息,另一個(gè)則為一個(gè)只能in的服務(wù),最終我們將打包服務(wù)并用
四種不同的方式部署部署它。
首先,讓我們看看這個(gè)簡單的Java類怎樣響應(yīng)一個(gè)服務(wù)。
做好準(zhǔn)備
在我們使用Axis2構(gòu)建任何東西之前,我們將需要關(guān)注一些家務(wù)事。現(xiàn)在你將需要準(zhǔn)備好你使用Axis2的環(huán)境,幸運(yùn)的是,它只包括一
些簡單的步驟:
1,下載并安裝Java(版本至少為JDK1.4)
2,下載Axis2并解壓到一個(gè)目標(biāo)目錄
3,復(fù)制axis2.war文件到你的servlet引擎的webapps目錄
4,設(shè)置AXIS2_HOME環(huán)境變量來指出目標(biāo)目錄,注意Axis2生成的所有腳本和構(gòu)建文件依賴于這個(gè)值,所以不要遺漏了這個(gè)步驟。
大多數(shù)情況下,我們的服務(wù)也將需要一個(gè)WSDL文件,Axis2的Java2WSDL可以用來生成一個(gè)WSDL。執(zhí)行以下步驟來從一個(gè)Java類生成一
個(gè)WSDL文件:
1,創(chuàng)建并編譯Java類
2,使用該命令生成WSDL:
%AXIS2_HOME%/bin/java2wsdl -cp . -cn samples.quickstart.service.pojo.StockQuoteService -of StockQuoteService.wsdl
移動(dòng)你生成WSDL文件,你可以做你需要的任何更改。例如,你可能添加自定義的過錯(cuò)或者改變生成的元素名。例如,該StockQuoteSer
vice.wsdl位于%AXIS2_HOME%/samples/quickstartadb/resources/META-INF文件夾,我們將在本指南的其他部分使用它,代替生成過
程創(chuàng)建的一般參數(shù)。
Axis2服務(wù)
在我們構(gòu)建任何東西之前,理解最終產(chǎn)品看起來像什么是有用的。Axis2的服務(wù)器端可以被部署在任何Servlet引擎上,并且有如下的
Code Listing 2顯示的結(jié)構(gòu)。
Code Listing 2: axis2.war的目錄結(jié)構(gòu)
- 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管理程序的一些JSPs,你可以通過它來執(zhí)行任何需要的動(dòng)作,例如添加服務(wù),使用模塊和禁止
模塊。WEB-INF包含了運(yùn)行部署到服務(wù)目錄的任何服務(wù)的實(shí)際上的java類和其他支持文件。
這里主要的文件是axis2.xml,它控制程序怎樣與接收的消息打交道,決定Axis2是否需要使用模塊目錄里定義的任何模塊。
這里你可以看到,服務(wù)可以被部署為*.aar文件,但是它們的內(nèi)容必須以一個(gè)特殊的方式安排。例如,服務(wù)的結(jié)構(gòu)將為如下:
- -?StockQuoteService??
- ???-?META-INF??
- ?????-?services.xml??
- ???-?samples??
- ?????-?quickstart??
- ???????-?service??
- ?????????-?pojo??
- ???????????-?StockQuoteService.class??
這不是太復(fù)雜,服務(wù)的名字為StockQuoteService,它在services.xml中指定,并且根據(jù)包名把任何Java類放到合適的位置。META-INF
目錄包含關(guān)于Axis2需要來正確執(zhí)行服務(wù)的額外信息。services.xml文件定義了服務(wù)本身并把Java類鏈接到它(參看Code Listing 3)。
Code Listing 3: 服務(wù)定義文件
- <service?name="StockQuoteService"?scope="application">??
- ????<description>??
- ????????Stock?Quote?Sample?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">??
- ????????samples.quickstart.service.pojo.StockQuoteService??
- ????</parameter>??
- </service>??
這里你看到服務(wù)本身被定義了,以及不同的消息交換模式相關(guān)的messageReceiver類型。
META-INF目錄也是你打算包含在該程序中的自定義WSDL文件的位置。
你可以通過簡單的采用該文件目錄結(jié)構(gòu)并復(fù)制到你的servlet引擎的webapps目錄來部署一個(gè)服務(wù),這是著名的"爆發(fā)"形式,但是你也
可以壓縮你的文檔到一個(gè)*.aar文件,類似于一個(gè)*.jar文件,并直接將*.aar文件放到servlet引擎的webapps目錄。
既然你理解了我們在嘗試完成什么,我們幾乎準(zhǔn)備好開始構(gòu)建了。
首先,下載并解壓合適版本的Axis2標(biāo)準(zhǔn)二進(jìn)制發(fā)布。確認(rèn)你設(shè)置了AXIS2_HOME變量的值來匹配你解壓該版本內(nèi)容的位置。
讓我們看看一些創(chuàng)建客戶端和服務(wù)的不同方式。
創(chuàng)建服務(wù)
在這個(gè)部分,我們將看看根據(jù)StockQuoteService類創(chuàng)建服務(wù)的五種方式:部署Plain Old Java Objects(POJO),使用AXIOM的OMElement
構(gòu)建服務(wù),使用Axis2 Databinding Framework(ADB)生成服務(wù),使用XMLBeans生成服務(wù)和使用JiBX生成服務(wù)。
部署POJOs
使用POJOs(Plain Old Java Objects)來部署服務(wù),執(zhí)行下面的步驟。
注意包含在<AXIS2_HOME>/samples/quickstart的目錄結(jié)構(gòu)(services.xml文件來自于該指南的第一個(gè)部分):
- -?quickstart??
- ???-?README.txt??
- ???-?build.xml??
- ???-?resources??
- ?????-?META-INF??
- ???????-?services.xml??
- ???-?src??
- ?????-?samples??
- ???????-?quickstart??
- ?????????-?service??
- ???????????-?pojo??
- ?????????????-?StockQuoteService.java??
注意你可以通過在quickstart目錄鍵入ant generate.wsdl來生成WSDL。
盡管如此,創(chuàng)建StockQuoteService.wsdl是可選的。它可以是直接從Java類生成的版本,或者該文件的一個(gè)自定義版本,并且servi
ces.xml是本文檔前面提到的同一文件。
現(xiàn)在通過在quickstart目錄鍵入ant generate.service來構(gòu)建工程,該目錄創(chuàng)建了以下目錄結(jié)構(gòu):
- -?quickstart/build/classes??
- ???-?META-INF??
- ?????-?services.xml??
- ???-?samples??
- ?????-?quickstart??
- ???????-?service??
- ?????????-?pojo??
- ???????????-?StockQuoteService.class??
如果你想以爆發(fā)形式部署服務(wù),重命名classes目錄為StockQuoteService,并復(fù)制它到你的servlet引擎的webapps/axis2/WEB-INF/s
ervices目錄。否則,復(fù)制build/StockQuoteService.aar文件到你的servlet引擎的webapps/axis2/WEB-INF/services目錄。然后通過
視察以下服務(wù)列表來確認(rèn)服務(wù)被正確部署:
http://localhost:8080/axis2/services/listServices
你也可以檢驗(yàn)以下WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
以及以下結(jié)構(gòu):
http://localhost:8080/axis2/services/StockQuoteService?xsd
一旦這些urls工作,讓我們快速測試一下服務(wù)。讓你的瀏覽器訪問以下URL試試:
http://localhost:8080/axis2/rest/StockQuoteService/getPrice?symbol=IBM
你將得到如下應(yīng)答:
- <ns:getPriceResponse?xmlns:ns="http://pojo.service.quickstart.samples/xsd"><ns:return>42</ns:return></ns:getPriceResponse>??
如果你像這樣調(diào)用update方法:
http://localhost:8080/axis2/rest/StockQuoteService/update?symbol=IBM&price=100
然后調(diào)用第一個(gè)getPrice url。你可以看到price被更新了。
使用AXIOM構(gòu)建服務(wù)
為了使用AXIOM"從零開始"構(gòu)建一個(gè)服務(wù),執(zhí)行以下步驟。
注意包含在/samples/quickstartaxiom的目錄結(jié)構(gòu):
- -?quickstartaxiom??
- ???-?README.txt??
- ???-?build.xml??
- ???-?resources??
- ?????-?META-INF??
- ???????-?services.xml??
- ???????-?StockQuoteService.wsdl??
- ???-?src??
- ?????-?samples??
- ???????-?quickstart??
- ?????????-?service??
- ???????????-?axiom??
- ?????????????-?StockQuoteService.java??
- ?????????-?clients??
- ???????????-?AXIOMClient.java??
由于AXIOM有一點(diǎn)不同,你將需要一個(gè)與POJO所用不同的services.xml文件,在Code Listing 4中顯示了它的定義。
Code Listing 4: 服務(wù)定義文件
- <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文件中,而且MessageReceiver現(xiàn)在是RawXML。
現(xiàn)在,上面提到的簡單的使用Axis2庫的類的StockQuoteService.java類,在Code Listing 5中定義。
Code Listing 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 Object Model,一個(gè)基于StAX API(Streaming API for XML)的DOM(Document Object Model)類似的結(jié)構(gòu)
作為服務(wù)的方法必須使用OMElement作為它們的參數(shù),OMElement表示一個(gè)XML元素,在這里它則為進(jìn)來的SOAP消息的有效載荷。這里,
你提取有效載荷元素的第一個(gè)孩子,添加文本給它,并使用它作為返回的OMElement的內(nèi)容。除非這是一個(gè)"只有in"的服務(wù),這些方法
必須返回一個(gè)OMElement,因?yàn)樗蔀榉祷氐腟OAP消息的有效載荷。
現(xiàn)在通過在Axis2_HOME/samples/quickstartaxiom目錄鍵入ant generate.service來構(gòu)建工程。
把StockQuoteService.aar文件放在servlet引擎的webapps/axis2/WEB-INF/services目錄,通過視察下面的服務(wù)列表來確認(rèn)服務(wù)正確
部署:
http://localhost:8080/axis2/services/listServices
你也可以檢驗(yàn)以下WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
以及以下結(jié)構(gòu):
http://localhost:8080/axis2/services/StockQuoteService?xsd
使用ADB生成服務(wù)
執(zhí)行以下步驟來使用Axis2 Databinding Framework(ADB)生成和部署服務(wù)。
通過在Axis2_HOME/samples/quickstartadb目錄鍵入以下內(nèi)容來使用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
選項(xiàng)-d adb指定了Axis Data Binding(ADB)。-s轉(zhuǎn)換指定同步或者只模塊化調(diào)用。-ss轉(zhuǎn)換創(chuàng)建服務(wù)器端代碼(骨架和相關(guān)文件)。-sd
轉(zhuǎn)換創(chuàng)建一個(gè)服務(wù)描述符(services.xml文件)。-ssi轉(zhuǎn)換為服務(wù)骨架創(chuàng)建一個(gè)接口。服務(wù)文件現(xiàn)在應(yīng)該定位于build/service。
如果你通過使用WSDL2Java直接生成代碼,下一步你需要修改生成的骨架來實(shí)現(xiàn)服務(wù)(如果你使用"ant generate.service",一個(gè)完全
的骨架會自動(dòng)復(fù)制并覆蓋生成的那個(gè))。
打開build/service/src/samples/quickstart/adb/service/StockQuoteServiceSkeleton.java文件并修改它來添加你的服務(wù)的功能性
到生成的方法,下面的Code Listing 6顯示了。
Code Listing 6:定義服務(wù)骨架文件
- 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?{??
- ??
- ????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;??
- ????}??
- }??
現(xiàn)在你可以通過在build/service目錄鍵入以下命令構(gòu)建工程:ant jar.server
如果一切進(jìn)展順利,你應(yīng)該在你的窗口看到BUILD SUCCESSFUL消息,而且StockQuoteService.aar文件在build/service/build/lib
目錄中。復(fù)制該文件到servlet引擎的webapps/axis2/WEB-INF/services目錄。
你可以通過視察下面的服務(wù)列表來確認(rèn)服務(wù)正確部署:
http://localhost:8080/axis2/services/listServices
你也可以檢驗(yàn)以下WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
以及以下結(jié)構(gòu):
http://localhost:8080/axis2/services/StockQuoteService?xsd
使用XMLBeans生成服務(wù)
執(zhí)行以下步驟來使用XMLBeans生成服務(wù)。
通過在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
選項(xiàng)-d xmlbeans指定XMLBeans數(shù)據(jù)綁定。-s轉(zhuǎn)換指定同步或者只是模塊化調(diào)用。-ss轉(zhuǎn)換創(chuàng)建服務(wù)器端代碼(骨架和相關(guān)文件)。-sd
轉(zhuǎn)換創(chuàng)建一個(gè)服務(wù)描述符(services.xml文件)。-ssi轉(zhuǎn)換創(chuàng)建一個(gè)服務(wù)骨架的接口。現(xiàn)在服務(wù)文件應(yīng)該位于build/service。
如果你通過使用WSDL2Java直接生成代碼,下一步你需要修改生成的骨架來實(shí)現(xiàn)服務(wù)(如果你使用"ant generate.service",一個(gè)完全
的骨架將被自動(dòng)復(fù)制并覆蓋生成的那個(gè))。
下一步打開build/service/src/samples/quickstart/service/xmlbeans/StockQuoteServiceSkeleton.java文件并修改它來添加你的
服務(wù)的功能性到生成的方法(參看Code Listing 7)。
Code Listing 7:定義服務(wù)骨架
- 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)?{??
- ????}??
- ??
- ????public?GetPriceResponseDocument?getPrice(GetPriceDocument?param1)?{??
- ????}??
- }??
通過在build/service目錄鍵入命令ant jar.server構(gòu)建項(xiàng)目,該目錄包含build.xml文件。
如果一切進(jìn)展順利,你應(yīng)該在你的窗口看到BUILD SUCCESSFUL消息,而且StockQuoteService.aar文件位于新創(chuàng)建的build/service/
build/lib目錄。復(fù)制該文件到servlet引擎的webapps/axis2/WEB-INF/services目錄。
你可以通過視察下面的服務(wù)列表來確認(rèn)服務(wù)正確部署:
http://localhost:8080/axis2/services/listServices
你也可以檢驗(yàn)以下WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
以及以下結(jié)構(gòu):
http://localhost:8080/axis2/services/StockQuoteService?xsd
使用JiBX生成服務(wù)
執(zhí)行以下步驟來使用JiBX數(shù)據(jù)綁定生成和部署服務(wù)。
通過在Axis2_HOME/samples/quickstartjibx目錄的控制臺鍵入以下內(nèi)容來使用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"
選項(xiàng)-d jibx指定了JiBX數(shù)據(jù)綁定。-s轉(zhuǎn)換指定同步或者只是模塊化調(diào)用。-ss轉(zhuǎn)換創(chuàng)建服務(wù)器端代碼(骨架和相關(guān)文件)。-sd轉(zhuǎn)換創(chuàng)建
一個(gè)服務(wù)描述符(services.xml文件)。-ssi轉(zhuǎn)換創(chuàng)建服務(wù)骨架的接口。-uw轉(zhuǎn)換解開傳遞給服務(wù)操作和從服務(wù)操作傳遞出去的參數(shù),來
創(chuàng)建一個(gè)更自然的編程接口。
在運(yùn)行WSDL2Java后,服務(wù)文件應(yīng)該位于build/service。如果你通過使用WSDL2Java直接生成代碼,下一步你需要修改生成的骨架來
實(shí)現(xiàn)服務(wù)(如果你使用"ant generate.service"則一個(gè)完全的骨架將自動(dòng)被復(fù)制并覆蓋生成的那個(gè))。打開build/service/src/samples
/quickstart/service/jibx/StockQuoteServiceSkeleton.java文件并修改它來添加你的服務(wù)的功能性到生成的方法,在Code Listing
8中顯示了。
Code Listing 8:定義服務(wù)骨架文件
- 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;??
- ????}??
- }??
現(xiàn)在你可以通過在build/service目錄鍵入命令ant jar.server構(gòu)建工程
如果一切進(jìn)展順利,你應(yīng)該在你的窗口看到BUILD SUCCESSFUL消息,并且StockQuoteService.aar文件位于build/service/build/lib
目錄。復(fù)制該文件到servlet引擎的webapps/axis2/WEB-INF/services目錄。
你可以通過視察下面的服務(wù)列表來確認(rèn)服務(wù)正確部署:
http://localhost:8080/axis2/services/listServices
你也可以檢驗(yàn)以下WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
以及以下結(jié)構(gòu):
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)建客戶端
在這個(gè)部分,我們將看看基于StockQuoteService類創(chuàng)建客戶端的四種方式:構(gòu)建基于AXIOM的客戶端,使用Axis2 Databinding Frame
work(ADB)生成客戶端,使用XMLBeans生成客戶端,使用JiBX生成客戶端。
使用AXIOM創(chuàng)建一個(gè)客戶端
執(zhí)行以下步驟來使用AXIOM構(gòu)建一個(gè)客戶端。
也注意在使用AXIOM創(chuàng)建服務(wù)部分顯示的目錄結(jié)構(gòu),為了完整性下面的重復(fù)了。
- -?quickstartaxiom??
- ???-?README.txt??
- ???-?build.xml??
- ???-?resources??
- ?????-?META-INF??
- ???????-?services.xml??
- ???????-?StockQuoteService.wsdl??
- ???-?src??
- ?????-?samples??
- ???????-?quickstart??
- ?????????-?service??
- ???????????-?axiom??
- ?????????????-?StockQuoteService.java??
- ?????????-?clients??
- ???????????-?AXIOMClient.java??
上面提到的AXIOMClient.java類的定義顯示在下面的Code Listing 9。
Code Listing 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("done");??
- ????????????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 Object Model,一個(gè)基于StAX API(Streaming API for XML)的DOM(Document Object Model)類似的結(jié)構(gòu)
這里你為服務(wù)的update和getPrice方法建立有效載荷。有效載荷的創(chuàng)建類似于你為AXIOM服務(wù)創(chuàng)建getPriceResponse有效載荷。然后
你創(chuàng)建Options類,并創(chuàng)建用來與服務(wù)交流的ServiceClient。首先你調(diào)用update方法,一個(gè)什么也不返回的fireAndForget方法。最后
你調(diào)用getPrice方法,并從服務(wù)得到當(dāng)前價(jià)格并顯示它。
現(xiàn)在你可以通過在Axis2_HOME/samples/quickstartaxiom目錄鍵入ant run.client構(gòu)建并運(yùn)行AXIOM客戶端。
你應(yīng)該得到以下輸出:
- done??
- Current?price?of?WSO:?123.42??
使用ADB生成一個(gè)客戶端
執(zhí)行以下步驟來使用Axis Data Binding(ADB)構(gòu)建一個(gè)客戶端。
通過在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類
- 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);??
- ??
- ????????}?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("done");??
- ????????}?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");??
- ????????}??
- ????}??
- ??
- }??
該類使用你創(chuàng)建的Axis Data Bindings創(chuàng)建一個(gè)客戶端存根。然后它在Web服務(wù)上調(diào)用getPrice和update操作。getPrice方法操作創(chuàng)建
GetPrice有效載荷并設(shè)置symbol為ABC。然后它發(fā)送請求并顯示當(dāng)前價(jià)格。update方法創(chuàng)建一個(gè)Update有效載荷,設(shè)置symbol為ABC及
price為42.35。
現(xiàn)在通過在Axis2_HOME/samples/quickstartadb目錄鍵入ant run.client來構(gòu)建并運(yùn)行客戶端。
你應(yīng)該得到以下輸出:
- 42??
- done??
使用XMLBeans生成一個(gè)客戶端
執(zhí)行以下步驟來使用XMLBeans數(shù)據(jù)綁定來構(gòu)建一個(gè)客戶端。
通過在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)建服務(wù)器端代碼。
下一步看看quickstartxmlbeans/src/samples/quickstart/clients/XMLBEANSClient.java,并在Code Listing 11看看它怎樣定義的
Code Listing 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);??
- ??
- ????????}?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?("ABC");??
- ????????????req.setPrice?(42.32);??
- ??
- ????????????stub.update(reqDoc);??
- ????????????System.err.println("done");??
- ????????}?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("ABC");??
- ??
- ????????????GetPriceResponseDocument?res?=??
- ????????????????stub.getPrice(reqDoc);??
- ??
- ????????????System.err.println(res.getGetPriceResponse().getReturn());??
- ????????}?catch(Exception?e){??
- ????????????e.printStackTrace();??
- ????????????System.err.println("\n\n\n");??
- ????????}??
- ????}??
- }??
該類使用你創(chuàng)建的XMLBeans數(shù)據(jù)綁定創(chuàng)建一個(gè)客戶端存根,然后它在Web服務(wù)上調(diào)用getPrice和update操作。getPrice方法操作創(chuàng)建
GetPriceDocument,它內(nèi)部的GetPrice類,并設(shè)置symbol為ABC。然后它發(fā)送請求并得到GetPriceResponseDocument并顯示當(dāng)前price
update方法創(chuàng)建一個(gè)UpdateDocument和Update并設(shè)置symbol為ABC及price為42.32,當(dāng)完成時(shí)顯示done。
現(xiàn)在通過在Axis2_HOME/samples/quickstartxmlbeans目錄鍵入ant run.client構(gòu)建并運(yùn)行工程。
你應(yīng)該得到下列輸出:
- 42??
- done??
使用JiBX生成一個(gè)客戶端
執(zhí)行以下步驟來使用JiBX構(gòu)建一個(gè)客戶端。
通過在Axis2_HOME/samples/quickstartjibx目錄的控制臺鍵入以下命令來生成客戶端存根:
- %AXIS2_HOME%/bin/wsdl2java?-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,在Code Listing 12顯示了。
Code Listing 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);??
- ??
- ????????}?catch(Exception?e){??
- ????????????e.printStackTrace();??
- ????????????System.err.println("\n\n\n");??
- ????????}??
- ????}??
- ??
- ????/*?fire?and?forget?*/??
- ????public?static?void?update(StockQuoteServiceStub?stub){??
- ????????try{??
- ????????????stub.update("ABC",?new?Double(42.35));??
- ????????????System.err.println("done");??
- ????????}?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("ABC"));??
- ????????}?catch(Exception?e){??
- ????????????e.printStackTrace();??
- ????????????System.err.println("\n\n\n");??
- ????????}??
- ????}??
- ??
- }??
該類使用創(chuàng)建的JiBX客戶端存根在Web服務(wù)上訪問getPrice和update操作。getPrice方法為股票"ABC"發(fā)送請求并顯示當(dāng)前price。
update方法為股票"ABC"設(shè)置價(jià)格為42.35。
現(xiàn)在通過在Axis2_HOME/samples/quickstartjibx目錄的控制臺鍵入"[b]ant run.client[b]"來構(gòu)建并運(yùn)行客戶端。
你應(yīng)該得到以下輸出:
- 42??
- done??
參考JiBX代碼生成集成來得到更多關(guān)于同Axis2使用JiBX的信息細(xì)節(jié)。
總結(jié)
Axis2是一個(gè)立刻讓web服務(wù)運(yùn)行起來的靈活和健壯的方式。本指南呈現(xiàn)了創(chuàng)建一個(gè)可以在Axis2上部署的服務(wù)的五種方法。現(xiàn)在你擁有
了使用多種不同技術(shù)來創(chuàng)建Web服務(wù)的靈活性。
進(jìn)一步學(xué)習(xí)
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