上個例子演示的是在當前項目下發布的Webservice Server,而實際應用中和Client是分離的,本文介紹兩種客戶端開發方式:
1.導出WebService服務端服務接口到jar包,客戶端引入jar包即可,Client開發步驟詳見上一篇博客。
2.通過wsimport工具導出webservice服務,同時簡化Client開發。
本文主要介紹通過wsimport導出webservice:
wsimport有幾個很重要的參數,
-d 表示輸出的目錄,目錄必須事先存在,否則導出失敗。
-keep表示導出webservice的class文件時是否也導出源代碼java文件。
-verbose表示詳細信息。
看我們的導出命令。我們直接導在d盤中。
我們直接把生成的目錄放在第2個建好的項目中去。這樣我們客戶端的項目就可以直接使用服務端的接口IMyservice了。順便我們把前一章的client訪問類也拷過來測試一下。目錄結構如下【注意這是一個新的項目】:
直接運行MyClient測試一下。
1 package org.WebService.ws.annotation; 2 3 import java.net.MalformedURLException; 4 import java.net.URL; 5 6 import javax.xml.namespace.QName; 7 import javax.xml.ws.Service; 8 9 public class Client { 10 11 public static void main(String[] args) throws MalformedURLException { 12 // TODO Auto-generated method stub 13 URL url=new URL("http://localhost:9998/hw?wsdl"); 14 QName qname = new QName("http://annotation.ws.WebService.org/", "CalculatorImplService"); 15 Service service = Service.create(url, qname); 16 ICalculator cal = service.getPort(ICalculator.class); 17 cal.add(1, 2); 18 cal.minus(2, 1); 19 20 } 21 22 }
和之前我們在服務端測試的效果是一樣的,不同的是文件不一樣。wsimport生成的文件將服務端的webservice折成若干文件了。每一個方法和請求分別對應2個文件。你會發現其中有個類CalculatorImpl:
@WebServiceClient(name="CalculatorImplService", targetNamespace="http://annotation.ws.WebService.org/", wsdlLocation="http://localhost:9998/hw?wsdl")
public class CalculatorImplService extends Service
{
這個類是注解好的客戶端程序,它里面有個方法:
@WebEndpoint(name="CalculatorImplPort")
public ICalculator getCalculatorImplPort()
{
return ((ICalculator)super.getPort(new QName("http://annotation.ws.WebService.org/", "CalculatorImplPort"), ICalculator.class));
}
直接幫我們生成了一個qname訪問程序。既然如何,我們就不用自己寫qname了,直接拿來用測試豈不更好?
簡化后的客戶端測試方法如下
- public class MyClient2 {
- public static void main(String[] args) {
- CalculatorImplService myServiceImplService=new CalculatorImplService();
- ICalculator msis= myServiceImplService.getCalculatorImplPort();
- msis.add(1, 4);
- msis.minus(1, 4);
- }
- }
結果是一樣的。