由于之前的示例是在當前項目下發布的server,也是在當前項目下訪問的server發布的webservice。但在實際應用中,我們的服務端往往是和客戶諯分離的,甚至它們是不同的項目中不同的人寫的。而像之前的在當前項目中使用服務端的接口類:IMyService就不太現實了。因為此時你只有服務端的wsdl,怎么可以直接用服務端的接口類接收并測試呢。如何解決這個問題?
?
JDK的bin目錄下自帶就有一個工具,wsimport。一個用來導出webservice的東東,服務端可以導其導出后生成jar文件,然后客戶端引用不就行了?
php調用webservice?好的,我們下面來看下怎么使用它。
它有幾個很重要的參數,
-d 表示輸出的目錄,目錄必須事先存在,否則導出失敗。
webservice調用方式,?-keep表示導出webservice的class文件時是否也導出源代碼java文件。
-verbose表示詳細信息。
看我們的導出命令。我們直接導在d盤中。
?
- wsimport?-d?d:?-keep?-verbose?http://localhost:7777/tudou?wsdl??
webService、
?
我們導出的文件目錄是D:\com\whaty\platform\ws\server這個目錄大家有沒有發現,正好和我們之前的服務器端目錄是一樣的,但實際上在wsdl中namespace是相反的http://server.ws.platform.whaty.com/。也就是說服務端生成wsdl時反過來生成了namespace,而wsimport根據wsdl生成時又反過來給還原了去。
?
webserviceclient,我們直接把生成的目錄放在第2個建好的項目中去。這樣我們客戶端的項目就可以直接使用服務端的接口IMyservice了。順便我們把前一章的client訪問類也拷過來測試一下。目錄結構如下【注意這是一個新的項目】:
直接運行MyClient測試一下。
?
- package?com.whaty.platform.ws.client;??
- ??
- import?java.net.MalformedURLException;??
- import?java.net.URL;??
- ??
- import?javax.xml.namespace.QName;??
- import?javax.xml.ws.Service;??
- ??
- import?com.whaty.platform.ws.server.IMyservice;??
- ??
- /**?
- ?*?@className:MyClient.java?
- ?*?@Desc:訪問發布的服務?
- ?*?@author:lizhuang?
- ?*?@createTime:2012-12-21?上午01:23:57?
- ?*/??
- public?class?MyClient?{??
- ????public?static?void?main(String[]?args)?{??
- ??
- ????????try?{??
- ????????????//服務WSDL?Document的地址??
- ????????????URL?url?=?new?URL("http://localhost:7777/tudou?wsdl");??
- ????????????//1.Qnameqname是qualified?name?的簡寫??
- ????????????//2.構成:由名字空間(namespace)前綴(prefix)以及冒號(:),還有一個元素名稱構成??
- ????????????//由發布的wsdl可知namespace為http://server.ws.platform.whaty.com/,??
- ????????????QName?qname=new?QName("http://server.ws.platform.whaty.com/","MyServiceImplService");??
- ????????????Service?service=Service.create(url,?qname);??
- ????????????IMyservice?ms=service.getPort(IMyservice.class);??
- ????????????ms.add(1,?4);??
- ????????????ms.minus(1,?4);??
- ????????}?catch?(MalformedURLException?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????}??
- }??
webservice客戶端生成、
控制臺打印:
?
a+b=5
a-b=-3
?
webservice客戶端調用?看到沒有,和之前我們在服務端測試的效果是一樣的,不同的是文件不一樣。wsimport生成的文件將服務端的webservice折成若干文件了。每一個方法和請求分別對應2個文件。你會發現其中有個類MyServiceImplService:
?
- @WebServiceClient(name?=?"MyServiceImplService",?targetNamespace?=?"http://server.ws.platform.whaty.com/",?wsdlLocation?=?"http://localhost:7777/tudou?wsdl")??
- public?class?MyServiceImplService??
這個類是注解好的客戶端程序,它里面有個方法:
?
soap webservice、?
- /**??
- ????*???
- ????*?@return??
- ????*?????returns?IMyservice??
- ????*/??
- ???@WebEndpoint(name?=?"MyServiceImplPort")??
- ???public?IMyservice?getMyServiceImplPort()?{??
- ???????return?super.getPort(new?QName("http://server.ws.platform.whaty.com/",?"MyServiceImplPort"),?IMyservice.class);??
- ???}??
直接幫我們生成了一個qname訪問程序。既然如何,我們就不用自己寫qname了,直接拿來用測試豈不更好?
?
簡化后的客戶端測試方法如下:
webservice 調用、?
- package?com.whaty.platform.ws.client;??
- ??
- import?com.whaty.platform.ws.server.IMyservice;??
- import?com.whaty.platform.ws.server.MyServiceImplService;??
- ??
- /**?
- ?*?@className:MyClient2.java?
- ?*?@Desc:使用JDK?wsimport生成的MyServiceImplService快速訪問我們的服務。?
- ?*?@author:lizhuang?
- ?*?@createTime:2012-12-22?上午12:24:37?
- ?*/??
- public?class?MyClient2?{??
- ????public?static?void?main(String[]?args)?{??
- ????????MyServiceImplService?myServiceImplService=new?MyServiceImplService();??
- ????????IMyservice?msis=?myServiceImplService.getMyServiceImplPort();??
- ????????msis.add(1,?4);??
- ????????msis.minus(1,?4);??
- ????}??
- }??
你會發現結果是一樣的。