Web服務和SOA(四)

 

使用SOAP協議來實現SOA服務<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Soap是簡單對象訪問協議(Simple Object Access Protocal)的縮寫,它是由W3C定義的Web服務的實現標準。基本說來,它定義了要交換的消息的結構,SOAP消息由信封、消息頭和消息體構成。下面您會看到,SOAP協議針對問題的複雜程度不同,其定義的層次也不盡相同。SOAP提供了很多強大的功能,其中包括:

(1)     能自動生成消息交換過程中所需要的類;

(2)     自動生成Web服務描述符(WSDL)

(3)     能自動從Web服務的WSDL中生成客戶端類;

(4)     能夠使用HTTP之外的協議(SMTPJMS)進行消息傳輸;

(5)     提供了消息驗證機制;

(6)     能夠建立有狀態的會話;

爲了讓您對該協議的實現有一個比較直觀的瞭解,我們還是以前面的例子,及JDK6自帶的功能來定義和發佈Web服務。我們前面的例子其實是利用JAXB庫對XML消息文檔和Java對象之間進行自動綁定,這裏我們使用JAX-WS庫進行這個操作。JAX-WS庫能明顯提高軟件層的抽象化層次。

現在,讓我們看看使用SOAP創建一個插入和更新的Web服務是何其簡單:

代碼清單14 – 使用JAX-WS註解創建SOAP服務

  1. package com.packt.soajava.soap.service.item;
  2. import javax.jws.WebMethod;
  3. import javax.jws.WebService;
  4. import javax.xml.ws.Endpoint;
  5. import com.packt.soajava.model.item.Item;
  6. import com.packt.soajava.model.item.Outcome;
  7. @WebService
  8. public class ItemWs {
  9. @WebMethod
  10. public Outcome insert(Item item) {
  11. //Insert item ...
  12. System.out.println("Inserting item "+item.getId()); 
  13. Outcome outcome = new Outcome();
  14. outcome.setRetCode("OK");
  15. outcome.setRetMessage("Item was inserted successfully");
  16. return outcome;
  17. }
  18. @WebMethod
  19. public Outcome update(Item item) {
  20. //Update item ...
  21. System.out.println("Updating item "+item.getId());
  22. Outcome outcome = new Outcome();
  23. outcome.setRetCode("OK");
  24. outcome.setRetMessage("Item was updated successfully");
  25. return outcome;
  26. }

您可以看到,上面的代碼非常簡潔,抽象化層次很高,它並不需要那些序列化和反序列化的代碼,它只包含了那些必需的代碼。用

SOAP實現Web服務和我們前面介紹的方法(POX-over-HTTPREST)都不盡相同。當我們使用基本的POX-over-HTTP方法開發Web服務時,我們需要爲某個功能(比如商品這個業務對象上的功能)創建幾個Servlets;在使用REST時我們需要新建一個類,而且REST中需要設計的業務方法正好和HTTP謂詞相一致而已。但使用SOAP協議,我們可以在Web服務中定義多種方法,每種方法都相互獨立,只要它們的方法簽名不同即可。

爲了發佈上面的Web服務,我們還需要完成以下幾步。首先,我們需要生成消息交換中所需要的類,這可通過JDK6自帶的wsgen工具完成,請打開命令行並輸入下列命令:

<JDK6_HOME>/bin/wsgen -cp <ProjectClassesRoot> -d <ProjectSourceRoot> -keep com.packt.soajava.soap.service.item.ItemWs

上面的命令將生成服務所需要的類,並把這些新生成的類放到<ProjectSourceRoot>(-d選項)所定義的路徑中,-cp選項定義了ItemWs類所在的類路徑。(譯者注,在我的機器上,我運行的命令爲:wsgen -cp C:/carl/workspace/SoaBookPoxHttp/WebRoot/WEB-INF/classes/ com.packt.soajava.soap.service.item.ItemWs -d C:/carl/workspace/SoaBookPoxHttp/src)。運行上述命令後,您會發現您的項目源文件夾中新增了一個新包(com.packt.soajava.soap.service.item.jaxws),這個包中有4個類。實際上,每個Web服務方法將產生兩個類,其中的一個類名和Web服務方法名相同但大寫首字母,另一個類名由方法名加Response構成。

現在,我們就可以發佈Web服務了,JDK6主要使用了原型使Web服務的發佈變得異常簡單,您只需要寫一個主類,運行下面一行代碼即可。

Endpoint.publish( "http://localhost:8001/SoaBookSOAP_server/itemWs", new ItemWs());

到此爲止,我們就完成了SOAP形式的Web服務的發佈,當然,您也可以修改上面URI中的地址和端口號。

那我們怎樣才能檢測我們的Web服務已經正確發佈了呢?最簡單的方法是打開瀏覽器,輸入下面的地址,請求該服務的WSDL

http://localhost:8001/SoaBookSOAP_server/itemWs?WSDL

您會在瀏覽器中看到由SOAP自動生成的WSDL(Web服務描述語言),其內容代表了Web服務的結構,WSDL文件對客戶端非常重要,客戶端可以依據它來自動生成客戶端需要的類。JDK6自帶的wsimport工具可以根據WSDL在客戶端自動生成需要的類,其用法如下:

<JDK6_HOME>/bin/wsimport -d <ClientProjectSourceRoot> -p com.packt.soajava.soap.client.test.item –keep http://localhost:8001/SoaBookSOAP_server/itemWs?WSDL

上面的命令可以在客戶端生成需要的類,並把它們放到客戶端項目文件夾中(-d選項指定)-p選項是爲客戶端生成的類指定包名(譯者注:我本機上運行的示例命令爲:wsimport -d C:/temp/ -p com.packt.soajava.soap.client.test.item -keep http://localhost:8001/SoaBookSOAP_server/itemWs?WSDL)。我們會在這些自動生成的類中發現ItemWsService(譯者注:我覺得是ObjectFactory這個類,不是作者說的這個),它是客戶端的工廠類,您還會發現ItemWs接口,ItemWsService工廠產生的服務代理會支持這個接口。

現在,客戶端的代碼就變得異常簡單:

  1. ItemWsService service = new ItemWsService();
  2. ItemWs itemWs = service.getItemWsPort();
  3. Item item1 = new Item();
  4. item1.set ...
  5. Outcome outcome = itemWs.insert(item1);

請您注意,支持SOAP的所有技術都能根據已經發布的Web服務的WSDL,自動生成自己的客戶端類。

總之,使用SOAP方法,我們可以使Web服務兩端的代碼變得簡潔,而那些中間比較困難的操作都交給那些自動產生的類來替我們完成。

[譯者注,如果您有興趣,請補齊上面的代碼,並創建一個客戶端項目來測試一下您創建的SOAP形式的Web服務。如果有困難,請參考附件,這是我的參考實現。首先,您需要創建兩個項目,一個是服務器端的實現,另一個是客戶端測試項目。服務器端的您需要完成Item.java, ItemWs.java, Outcome.java, Test.java這幾個類的代碼,然後運行genws命令,然後運行主類Test;客戶端請先運行wsimport命令生成必須的客戶端類,然後將它們導入到客戶端項目中,然後再手動添加一個測試類TestMain.java。此時,您可以使用Apache TCPMon工具觀察Soap請求和應答的XML文檔,如下圖所示:


本文源代碼下載地址:http://blog.ccidnet.com/job-htm-action-download-itemid-813217-aid-88694.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章