參考:https://blog.csdn.net/c99463904/article/details/76018436
1、WebService簡介?
Web Service技術, 能使得運行在不同機器上的不同應用無須借助附加的、專門的第三方軟件或硬件, 就可相互交換數據或集成。依據Web Service規范實施的應用之間, 無論它們所使用的語言、 平台或內部協議是什么, 都可以相互交換數據。
簡單的說,WebService就是一種跨編程語言和跨操作系統平台的遠程調用技術。所謂跨編程語言和跨操作平台,就是說服務端程序采用java編寫,客戶端程序則可以采用其他編程語言編寫,反之亦然。跨操作系統平台則是指服務端程序和客戶端程序可以在不同的操作系統上運行。 遠程調用,就是一台計算機的應用可以調用其他計算機上的應用。例如:支付寶,支付寶並沒有銀行卡等數據,它只是去調用銀行提供的接口來獲得數據。還有天氣預報等,也是氣象局把自己的系統服務以webservice服務的形式暴露出來,讓第三方網站和程序可以調用這些服務功能,再比如,各個門戶網站顯示的股票行情信息數據。
2、WebService原理?
1)、XML,SOAP和WSDL就是構成WebService平台的三大技術 。
2)、WebService采用Http協議來在客戶端和服務端之間傳輸數據。WebService使用XML來封裝數據,XML主要的優點在於它是跨平台的。
3)、WebService通過HTTP協議發送請求和接收結果時,發送的請求內容和結果內容都采用XML格式封裝,並增加了一些特定的HTTP消息頭,以說明HTTP消息的內容格式,這些特定的HTTP消息頭和XML內容格式就是SOAP協議規定的。
4)、WebService服務器端首先要通過一個WSDL文件來說明自己有什么服務可以對外調用。簡單的說,WSDL就像是一個說明書,用於描述WebService及其方法、參數和返回值。 WSDL文件保存在Web服務器上,通過一個url地址就可以訪問到它。客戶端要調用一個WebService服務之前,要知道該服務的WSDL文件的地址。WebService服務提供商可以通過兩種方式來暴露它的WSDL文件地址:1.注冊到UDDI服務器,以便被人查找;2.直接告訴給客戶端調用者。
5)、WebService交互的過程就是,WebService遵循SOAP協議通過XML封裝數據,然后由Http協議來傳輸數據。
3、Web Service是什么?
1)、基於Web的服務:服務器端整出一些資源讓客戶端應用訪問(獲取數據)。
2)、一個跨語言、跨平台的規范(抽象)。
3)、多個跨平台、跨語言的應用間通信整合的方案(實際)。
4)、以各個網站顯示天氣預報功能為例,氣象中心的管理系統將收集的天氣信息並將數據暴露出來(通過WebService Server),而各大站點的應用就去調用它們得到天氣信息並以不同的樣式去展示(WebService Client),網站提供了天氣預報的服務,但其實它們什么也沒有做,只是簡單了調用了一下氣象中心服務器上的一段代碼而已。
4、為什么要用Web service?
答:web service能解決:跨平台調用、跨語言調用、遠程調用。
5、什么時候使用web Service?
1)、同一家公司的新舊應用之間。
2)、不同公司的應用之間,分析業務需求:天貓網與中通物流系統如何交互。
3)、一些提供數據的內容聚合應用:天氣預報、股票行情。
6、Web Service中的幾個重要術語.
1)、 WSDL:web service definition language(WebService定義語言)。
1.1、對應一種類型的文件.wsdl。
1.2、定義了web service的服務器端與客戶端應用交互傳遞請求和響應數據的格式和方式。
1.3、一個web service對應一個唯一的wsdl文檔。
2)、SOAP:simple object access protocal(簡單對象訪問協議)。
2.1、是一種簡單的、基於HTTP和XML的協議, 用於在WEB上交換結構化的數據,結構化數據實際上就是xml的數據。
2.2、soap消息:請求消息和響應消息。
2.3、http+xml片斷。
3)、SEI:WebService EndPoint Interface(終端, web service的終端接口)。
3.1、就是WebService服務器端用來處理請求的接口。
4)、CXF:Celtix + XFire,一個apache的用於開發webservice服務器端和客戶端的框架。
7、WebService入門案例,開發webservice的條件,使用JDK開發(JDK版本,1.6及以上版本),在實際的項目中可以使用CXF框架進行開發。webservice的組成是由客戶端和服務器端組成的。
第一步,首先,編寫SEI(Service Endpoint Interface),SEI在webservice中稱為portType,在java中就是普通接口 。
1 package com.bie.webservice.sei; 2 3 import javax.jws.WebMethod; 4 import javax.jws.WebService; 5 6 /** 7 * 8 * @author 9 * 編寫SEI(Service Endpoint Interface),SEI在webservice中稱為portType,在java中就是普通接口 。 10 * 11 * 1、第一步,開發服務器端,Web Service編碼。 12 * –@WebService(SEI和SEI的實現類),該注解用來定義SEI和SEI的實現類。 13 * –@WebMethod(SEI中的所有方法),該注解用來定義SEI里面的方法。 14 * 2、第二步,發布Web Service,–Endpoint(終端, 發布webservice)。 15 */ 16 @WebService 17 public interface HelloWebServiceSEI { 18 19 @WebMethod 20 public String sayHello(String name); 21 22 }
第二步,編寫SEI實現類,此類作為webservice提供服務類,如下所示:
1 package com.bie.webservice.sei.impl; 2 3 import javax.jws.WebService; 4 5 import com.bie.webservice.sei.HelloWebServiceSEI; 6 7 /** 8 * 9 * @author 10 * 11 * 1、SEI實現類 12 * 13 * 14 */ 15 @WebService // SEI實現類也要使用此注解 16 public class HelloWebServiceSEIImpl implements HelloWebServiceSEI { 17 18 @Override 19 public String sayHello(String name) { 20 System.out.println("Service server sayHello() : " + name); 21 return "hello " + name; 22 } 23 24 }
第三步:發布服務,Endpoint類發布服務,publish方法,兩個參數:參數1.服務地址,參數2.服務實現類。
1 package com.bie.webservice.endpoint; 2 3 import javax.xml.ws.Endpoint; 4 5 import com.bie.webservice.sei.HelloWebServiceSEI; 6 import com.bie.webservice.sei.impl.HelloWebServiceSEIImpl; 7 8 /** 9 * 10 * @author 1、發布WebService,Endpoint(終端, 發布webservice)。 11 * 12 */ 13 public class WebServiceEndpoint { 14 15 public static void main(String[] args) { 16 // 使用Endpoint發布webservice 17 // 參數一,url地址 18 String address = "http://localhost:8989/webservice/hello"; 19 // 參數二,是SEI實現類對象 20 HelloWebServiceSEI implementor = new HelloWebServiceSEIImpl(); 21 Endpoint.publish(address, implementor); 22 23 System.out.println("使用Endpoint發布webservice,發布成功Success......"); 24 } 25 26 }
第四步,測試服務是否發布成功,通過閱讀wsdl,確定客戶端調用的接口、方法、參數和返回值存在,證明服務發布成功。我們在瀏覽器輸入 http://127.0.0.1:8989/webservice/hello?wsdl 來獲取wsdl文件進行閱讀。wsdl,是以XML文件形式來描述WebService的"說明書",有了說明書,我們才可以知道如何使用或是調用這個服務。現在我們還不知道怎么去閱讀,后面我們會詳解,只要能獲取到,就能確定WebService服務發布成功。
現在,首先使用eclipse提供的web service瀏覽器訪問,查看對應的wsdl文檔(每一個WebService都有一個wsdl文檔):http://localhost:8989/webservice/hello?wsdl (一般瀏覽器就可以進行訪問),請求webService並查看請求和響應消息(webservice瀏覽器)。
也可以使用eclipse自帶的web service瀏覽器進行訪問的,輸入參數,就可以進行調用服務器端的方法,如下所示:
8、客戶端的實現,客戶端調用服務有很多種方法,我們先用工具生成客戶端代碼,wsimport(借助jdk的wsimort.exe工具生成客戶端代碼)是jdk自帶的webservice客戶端工具,可以根據wsdl文檔生成客戶端調用代碼(java代碼)。當然,無論服務器端的WebService是用什么語言寫的,都可以生成調用webservice的客戶端代碼。
首先,創建一個客戶端空項目,cmd命令行模式下,進入此項目的src目錄,使用以下命令生成客戶端代碼:wsimport -s . http://localhost:8989/webservice/hello?wsdl。
其中,-s參數是指編譯出源代碼文件,后面的.(點)指將代碼放到當前目錄下,最后面的http://localhost:8989/webservice/hello是指獲取wsdl說明書的地址。
這里借助jdk的wsimort.exe工具生成客戶端代碼:wsimport -keep http://localhost:8989/webservice/hello?wsdl,wsimport -keep url,其中url為wsdl文件的路徑。
然后刷新eclipse的項目,可以看到已經生成完畢了,如下所示:
開始編寫客戶端,如下所示:
1 package com.bie.webservice.client; 2 3 import com.bie.webservice.sei.impl.HelloWebServiceSEIImpl; 4 import com.bie.webservice.sei.impl.HelloWebServiceSEIImplService; 5 6 /** 7 * 調用WebService里面的方法,借助生成的代碼編寫請求代碼 8 * 9 * @author 10 * 11 */ 12 public class HelloClient { 13 14 public static void main(String[] args) { 15 // 創建服務視圖,視圖是從wsdl文件的service標簽的name屬性獲取 16 HelloWebServiceSEIImplService factory = new HelloWebServiceSEIImplService(); 17 // 獲取到jdk動態對立對象 18 // 獲取服務實現類,實現類從wsdl文件的portType的name屬性獲取 19 HelloWebServiceSEIImpl helloWebServiceSEIImplPort = factory.getHelloWebServiceSEIImplPort(); 20 // class com.sun.proxy.$Proxy32 21 System.out.println(helloWebServiceSEIImplPort.getClass()); 22 // 獲取查詢方法,從portType的operation標簽獲取 23 String sayHello = helloWebServiceSEIImplPort.sayHello("Tom"); 24 System.out.println("client : " + sayHello); 25 26 } 27 28 }
效果如下所示:
9、監聽請求和相應的過程,可以使用工具TCP/IP Monitor。
監聽請求: 使用Eclipse的TCP/IP工具(端口轉發器),這需要一個工具TCP/IP Monitor ,Eclipse自帶的Debug工具之一,用於捕獲Http、TCP/IP協議包。原理是一個代理服務,客戶端先把數據發送到代理服務,然后代理服務再把數據發送到服務器,這樣就能獲取請求數據和響應數據。
第一步:打開這個工具,選擇Window -> Preferences -> Run/Debug (Tcp/Ip Monitor)。或者輸入TCP/IP Monitor找到即可。
新增一個Tcp/Ip Monitor,然后點擊啟動start按鈕啟動,如下所示:
第二步,檢測是否設置成功,我們訪問代理服務器來獲得wsdl文件,如下所示:
第三步,將服務器端的WSDL文檔保存到客戶端本地,然后修改文檔,將端口號從8989改為8080,然后根據本地的wsdl文檔生成客戶端代碼(可以將之前由網絡生成的代碼刪除掉的), 並編寫客戶端的調用代碼,最后配置eclipse的TCP/IP,啟動監聽。
根據本地文件生成客戶端代碼,如下所示:
第四步,由本地生成的代碼,啟動客戶端來進行監聽測試,獲取請求數據和響應數據,如下所示:
10、免費webservice地址:http://www.webxml.com.cn/zh_cn/web_services.aspx。
現在以調用免費的web service(天氣預報),Google”免費WebService”,找到提供天氣預報Webservice的網絡地址http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx。
客戶端編碼方式訪問,借助命令工具自動生成客戶端代碼(只要拿到Webservice服務器端的wsdl即可生成客戶端的代碼),借助生成的代碼編寫請求代碼。
1 PS D:\eclipse\workspace_spring\weatherWebService\src> wsimport -keep http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl 2 正在解析 WSDL... 3 4 5 [WARNING] src-resolve.4.2: 解析組件 's:schema' 時出錯。在該組件中檢測到 's:schema' 位於名稱空間 'http://www.w3.org/2001/XMLSchema' 中, 但無法從方案文檔 'http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl#types?schema1' 引用此名稱空間的組件。如果這是不正確的名稱空間, 則很可能需要更改 's:schema' 的前綴。如果這是正確的名稱空間, 則應將適當的 'import' 標記添加到 'http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl#types?schema1'。 6 http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl#types?schema1的第 15 行 7 8 [WARNING] src-resolve: 無法將名稱 's:schema' 解析為 'element declaration' 組件。 9 http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl#types?schema1的第 15 行 10 11 [ERROR] undefined element declaration 's:schema' 12 http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl的第 15 行 13 14 [ERROR] undefined element declaration 's:schema' 15 http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl的第 61 行 16 17 [ERROR] undefined element declaration 's:schema' 18 http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl的第 101 行 19 20 Exception in thread "main" com.sun.tools.internal.ws.wscompile.AbortException 21 at com.sun.tools.internal.ws.processor.modeler.wsdl.JAXBModelBuilder.bind(JAXBModelBuilder.java:129) 22 at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.buildJAXBModel(WSDLModeler.java:2283) 23 at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.internalBuildModel(WSDLModeler.java:183) 24 at com.sun.tools.internal.ws.processor.modeler.wsdl.WSDLModeler.buildModel(WSDLModeler.java:126) 25 at com.sun.tools.internal.ws.wscompile.WsimportTool.buildWsdlModel(WsimportTool.java:429) 26 at com.sun.tools.internal.ws.wscompile.WsimportTool.run(WsimportTool.java:190) 27 at com.sun.tools.internal.ws.wscompile.WsimportTool.run(WsimportTool.java:168) 28 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 29 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 30 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 31 at java.lang.reflect.Method.invoke(Method.java:498) 32 at com.sun.tools.internal.ws.Invoker.invoke(Invoker.java:159) 33 at com.sun.tools.internal.ws.WsImport.main(WsImport.java:42) 34 PS D:\eclipse\workspace_spring\weatherWebService\src>
說明: 直接生成客戶端代碼會拋異常, 無法生成客戶端代碼,,解決辦法:
第一步,將對應的wsdl文檔保存到本地。
第二步,修改wsdl文檔的部分內容(有三處需要更換的):將 <s:element ref="s:schema" /><s:any /> 替換成 <s:any minOccurs="2" maxOccurs="2"/>。
備注: 這個是Java調用.net的webservice都有的問題。
將使用的網絡地址url修改為本地地址的url,如下所示:
開始編寫客戶端測試代碼,如下所示:
1 package cn.com.webxml.client; 2 3 import java.util.Iterator; 4 import java.util.List; 5 6 import cn.com.webxml.ArrayOfString; 7 import cn.com.webxml.WeatherWS; 8 import cn.com.webxml.WeatherWSSoap; 9 10 public class WeatherClient { 11 12 public static void main(String[] args) { 13 // 尋找起始類,可以根據WeatherWS.wsdl文檔里面的<wsdl:service name="WeatherWS">此標簽 14 // 此標簽里面的類即為起始類,繼承Service,此類相當於是一個工廠 15 WeatherWS weatherWS = new WeatherWS(); 16 // 返回一個代理對象,獲取此對象就可以進行發送請求了 17 WeatherWSSoap weatherWSSoap = weatherWS.getWeatherWSSoap(); 18 // 調用獲取天氣的對象,系統維護 免費用戶服務暫停。http://www.webxml.com.cn/ 19 String theCityCode = "原陽縣";// 地方 20 String theUserID = "";// 可以為空 21 ArrayOfString weather = weatherWSSoap.getWeather(theCityCode, theUserID); 22 List<String> list = weather.getString(); 23 // 必須可以上網才可以進行調用 24 for (int i = 0; i < list.size(); i++) { 25 System.out.println(list.get(i)); 26 } 27 28 // 獲得中國省份、直轄市、地區和與之對應的ID 29 ArrayOfString regionProvince = weatherWSSoap.getRegionProvince(); 30 Iterator<String> iterator = regionProvince.getString().iterator(); 31 while (iterator.hasNext()) { 32 String next = iterator.next(); 33 System.out.println(next); 34 } 35 } 36 37 }
可以再搞一下獲取手機號歸屬地的操作,如下所示:
1 package cn.com.webxml.client; 2 3 import cn.com.webxml.MobileCodeWS; 4 import cn.com.webxml.MobileCodeWSSoap; 5 6 public class PhoneClient { 7 8 public static void main(String[] args) { 9 MobileCodeWS factory = new MobileCodeWS(); 10 MobileCodeWSSoap mobileCodeWSSoap = factory.getMobileCodeWSSoap(); 11 String mobileCode = "1851375xxxx"; 12 String userID = ""; 13 String mobileCodeInfo = mobileCodeWSSoap.getMobileCodeInfo(mobileCode, userID); 14 System.out.println(mobileCodeInfo); 15 } 16 17 }
11、使用CXF開發web service,加入cxf的jar包即可(apache-cxf-2.5.9\lib下面的jar包),其它不需要改動,啟動的時候就變成了以cxf的方式進行啟動了。引入cxf的包之后,啟動服務端,可以進行訪問查看,如下所示:
配置一下D:\biehl\apache-cxf-2.5.9\bin的路徑到環境變量中,開始使用此框架的生成代碼腳本,如下所示:
然后將;%APACHE-CXF_PATH%\bin;加到path最后即可。然后根據D:\biehl\apache-cxf-2.5.9\bin\wsdl2java.bat腳本生成客戶端代碼,如下所示:
然后刷新項目即可就可以看到生成的代碼了。
12、WebService請求深入分析,分析WebService的WSDL文檔結構。
WSDL(Web Services Description Language), web服務描述語言,他是webservice服務端使用說明書,說明服務端接口、方法、參數和返回值,WSDL是隨服務發布成功,自動生成,無需編寫。
文檔結構,如下所示:
1)、Service:相關端口的集合,包括其關聯的接口、操作、消息等。
說明:service服務器端的一個webservice的容器,其name屬性用來指定客戶端容器類。其port屬性用來指定一個服務器端處理請求的入口(就是SEI的實現),binding屬性用來引用上面定義的<binding>標簽。address標簽是當前webservice的請求地址。
2)、Binding:特定端口類型的具體協議和數據格式規范的綁定。
說明:binding用於定義SEI的實現類,binding的type屬性引用上面定義的prottype標簽,<soap:binding style="document"> 綁定的數據是一個document。子標簽operation用來定義實現類的方法,<soap:operation style="document"/> 傳輸的是document即xml,其子標簽input指定客戶端應用傳過來的數據,input的子標簽<soap:body use="literal"/>傳輸的是xml格式的文本數據,子標簽output指定服務器端返回給客戶端的數據,output的子標簽<soap:body use="literal"/>傳輸的是xml格式的文本數據。
3)、portType: 服務端點,描述 web service可被執行的操作方法,以及相關的消息,通過binding指向portType,用來指定服務器端的SEI,operation用來指定SEI中的處理請求的方法。
說明:protype用來定義服務器端的SEI,子標簽operator用來指定SEI的處理請求的方法,子標簽input指定客戶端應用傳過來的數據,會引用上面定義的message標簽,子標簽output指定服務器端返回給客戶端的數據同時引用上面的message標簽。
4)、message: 定義一個操作(方法)的數據參數。通信消息的數據結構的抽象類型化定義。引用types中定義的標簽。
說明:message用來定義消息的結構,part指定引用types中定義的標簽片段。
5)、types: 定義 web service 使用的全部數據類型,數據類型(標簽)定義的容器,里面使用schema定義了一些標簽結構供message引用。
6)、port - 定義為協議/數據格式綁定與具體Web訪問地址組合的單個服務訪問點。
閱讀方式WSDL文檔應該從下往上閱讀。
第一步、先看service標簽,看相應port的binding屬性,然后通過值查找上面的binding標簽。
第二步、通過binding標簽可以獲得具體協議等信息,然后查看binding的type屬性
第三步、通過binding的type屬性,查找對應的portType,可以獲得可操作的方法和參數、返回值等。
第四步、通過portType下的operation標簽的message屬性,可以向上查找message獲取具體的數據參數信息。
13、SOAP,SOAP即簡單對象訪問協議,他是使用http發送的XML格式的數據,它可以跨平台,跨防火牆,SOAP不是webservice的專有協議。
1)、SOAP=http+xml。
2)、SOAP結構,如下所示:
a、必需的 Envelope 元素,可把此XML文檔標識為一條 SOAP 消息。
b、可選的 Header 元素,包含頭部信息。
c、必需的 Body 元素,包含所有的調用和響應信息。
d、可選的 Fault 元素,提供有關在處理此消息所發生錯誤的信息。
14、CXF支持的數據類型,參數調用的時候可以使用這些參數類型進行調用。
1)、基本類型,int,float,boolean等
2)、引用類型,String、集合包含數組,List, Set,Map。自定義類型,比如實體類類型。
15、一次Web service請求的流程,其本質,如下所示:
1)、客戶端向服務器端發送了一個soap消息(http請求+xml片斷),調用服務器端方法的時候發送請求,發送的是soap消息(http請求+xml片斷,此xml片段是參考wsdl文件生成的),遵循的還是http協議,調用服務器端的某個方法,可以將參數傳遞給該方法進行調用。
2)、服務器端處理完請求后, 向客戶端返回一個soap消息(xml片段)。
16、使用注解修改WSDL內容,作用是通過注解,可以更加形像的描述Web服務。對自動生成的wsdl文檔進行修改,為使用者提供一個更加清晰的wsdl文檔。
1 WebService的注解都位於javax.jws包下: 2 3 @WebService-定義服務,在類上邊,作用在具體類上。而不是接口。一個類只有添加了此注解才可以通過Endpoint發布為一個web服務。一個添加了此注解的類,必須要至少包含一個實例方法。靜態方法和final方法不能被發布為服務方法: 4 targetNamespace:指定命名空間。 5 name:Web Service的portType的名稱。 6 portName:Web Service的端口port的名稱。 7 serviceName:Web Service的服務名稱。 8 endpointInterface:SEI接口地址,如果一個服務類實現了多個接口,只需要發布一個接口的方法,可通過此注解指定要發布服務的接口。 定義服務抽象Web Service協定的服務端點接口的完整名稱。
wsdlLocation:描述服務的預定義WSDL的位置。
9 10 @WebMethod-定義方法,在公開方法上邊,此注解用在方法上,用於修改對外暴漏的方法,定制返回值到wsdl部分和xml元素的映射關系: 11 operationName:方法名。 12 exclude:設置為true表示此方法不是webservice方法,反之則表示webservice方法,默認是false,將某一方法標記為不作為一個web方法公開 。 13 14 @WebResult-定義返回值,在方法返回值前邊,用於定制返回值到wsdl的映射: 15 name:返回結果值的名稱 。
header:如果為true,則結果是從消息頭而不是消息正文獲取的。
partName:表示此返回值的wsdl:part的名稱。
targetNamespace返回值的xml名稱空間。 16 17 @WebParam-定義參數,在方法參數前邊,用於定義wsdl中的參數映射,定制單個參數到web service消息部分和xml元素的映射關系: 18 name:指定參數的名稱。
header:如果為true,則參數是從消息頭而不是消息正文獲取的。
node:參數的流向(in、out、inout之一)。
partName:表示此參數的wsdl:part的名稱。
targetNamespace:參數的xml名稱空間。
案例,如下所示:
1 package com.bie.webservice.sei.impl; 2 3 import javax.jws.WebMethod; 4 import javax.jws.WebParam; 5 import javax.jws.WebResult; 6 import javax.jws.WebService; 7 8 import com.bie.webservice.sei.HelloWebServiceSEI; 9 10 /** 11 * 12 * @author 13 * 14 * 1、SEI實現類 15 * 16 * 17 */ 18 @WebService( 19 targetNamespace = "http://www.biexiansheng.com", 20 portName = "HelloSOAPPort", 21 serviceName = "HelloWSS", 22 name = "HelloSOAP") // SEI實現類也要使用此注解 23 public class HelloWebServiceSEIImpl implements HelloWebServiceSEI { 24 25 @Override 26 @WebMethod( 27 operationName="getHello", 28 exclude=false 29 ) 30 public @WebResult(name="hellResult")String sayHello(@WebParam(name="helloName")String name) { 31 System.out.println("Service server sayHello() : " + name); 32 return "hello " + name; 33 } 34 35 }
演示效果,如下所示: