jax-ws實現Webservice入門教程 (客戶端呼叫服務端實現)
前兩節中簡單的介紹了一下基本的JAX-WS API的使用,這一節更進一步的介紹一些其他的內容
一、wsimport工具的使用
在第二節中(http://liugang594.iteye.com/blog/1343608),可以看到要手動建立一個client端進行一次正確的呼叫,需要關注的東西還是挺多的,尤其是定義一個符合格式的方法定義在引數相當複雜的情況下是相當不容易的。
這裡JDK中提供了一個 wsimport 的工具,路徑為 “JDK_PATH/bin”,可以相當方便的用來建立相應wsdl的Service類檔案和Port類檔案。
-d:生成客戶端執行類的class檔案的存放目錄 -s:生成客戶端執行類的原始檔的存放目錄 -keep:表示匯出webservice的class檔案時是否也匯出原始碼java檔案要使用wsimport,命令列如下:
Java程式碼- wsimport -keep http://localhost:9999/ws/hello?wsdl
然後就會根據這個wsdl生成幾個相應的類檔案,例如使用第一節的例子會生成8個類檔案
其中主要的是一個Service類 CalculatorImplService.java 和 一個EndpointInterface類 Calculator。
有了這些類以後,就可以很簡單的實現Client端了,例如:
Java程式碼-
CalculatorImplService service = new CalculatorImplService();
- Calculator calculator = service.getPortName();
- System.out.println(calculator.add(1, 2));
如此方便,不能自己。
二、檢視來往的Soap訊息
由於所有的訊息都是通過類的方法被Java在後臺封裝了,所以一大不利處就是沒法檢視具體傳送的Soap訊息和返回的結果。
所以需要一個工具用來檢視與特定的Server和Port上訊息的互動。有一大堆工具可以做這個,這裡我介紹一下Eclipse裡的TCP/IP Monitor工具如何來做。
開啟 "Window->Preferences->Run/Debug->TCP/IP Monitor"選單就可以看到TCP/IP Monitor的配置頁了,如下。(如果你的eclipse裡沒有這一項,那可能是你的版本比較低,建議更新一個版本試試,我的版本是3.6.2)
點選“add”按鈕,就可以新建一個Monitor,配置說明如下:
- Local monitoring port:定義用來中轉的本地埠。例如你本來想訪問的時候本地的8000埠,你在此處定義的是8001埠,那你的訪問埠也需要改成8001,然後由monitor把你的請求進行轉發。
- Host name:你要監視的與本地通訊的主機地址
- Port:你要監視的與本地通訊的主機埠
- Type:通訊方式,有HTTP和TCP/IP兩個選項
- Timeout:超時設定
定義完以後,選中這個配置,點選"start",監視器即起用。
然後通過"Window->Show View->Other->Debug->TCP/IP Monitor",開啟監視檢視:
即可。
本來我的Client端的實現程式碼應該是:
Java程式碼- URL url = new URL("http://localhost:8086/calculator?wsdl");
- QName qName = new QName("http://www.liulutu.com/calculator/",
- "CalculatorImplService");
- Service service = Service.create(url, qName);
- Calculator port = service.getPort(Calculator.class);
- System.out.println(port.add(1, 2));
一旦我使用了諸如上面的監視器,並且想監視這個WebService的請求成響應,那麼這裡url的埠就需要由8086改成8087:
Java程式碼- URL url = new URL("http://localhost:8087/calculator?wsdl");
- QName qName = new QName("http://www.liulutu.com/calculator/",
- "CalculatorImplService");
- Service service = Service.create(url, qName);
- Calculator port = service.getPort(Calculator.class);
- System.out.println(port.add(1, 2));
通過監視器來進行中間的轉發,即可觀察到來往的訊息互動: