1. 程式人生 > >webservice學習記錄01

webservice學習記錄01

Webservice

Webservice就是一種遠端呼叫技術,他的作用就是從遠端系統中獲取業務資料

課程安排

1.1  什麼webservice
1.2  Webservice入門程式
1.3  Webservice的應用場景
1.4  Webservice的三要素
1.5  WSDLweb服務描述語言
1.6  SOAP:簡單物件訪問協議
1.7  UDDI:目錄服務
1.8  Webservice的四種客戶端呼叫方式
1.9  生成客戶端呼叫方式
1.10  客戶端程式設計呼叫方式
1.11  HttpURLConnecton呼叫方式
1.12  Ajax呼叫方式
1.13  深入開發:用註解修改WSDL內容

什麼webservice

2.1 什麼是遠端呼叫技術

遠端呼叫資料定義:系統和系統之間的呼叫


2.2 Webservice的原理圖

  1. Webservice是使用Http傳送SOAP協議的資料的一種遠端呼叫技術
  2. Webservice要開發服務端
  3. Webservice要開發客戶端
  4. Webservice客戶端開發需要閱讀服務端的使用說明書(WSDL

 

Webservice的入門程式

3.1 需求

  • 服務端釋出一個天氣查詢服務,接收客戶端城市名,返回天氣資料給客戶端
  • 客戶端傳送城市名稱給服務端,接收服務端返回天氣資料,列印

3.2 環境

  • JDK1.6
  • MyEclipse:10.0

3.3 實現

3.3.1 服務端

開發步驟

第一步建立SEIService Endpoint Interface介面,本質上就是Java介面

package cn.itcast.ws.jaxws.ws;

/**
 * SEI介面
 * @author Administrator
 *
 */
public interface WeatherInterface {

	public String queryWeather(String cityName);
}
第二步建立SEI實現類實現類上加入@WebService 
package cn.itcast.ws.jaxws.ws;

import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.xml.ws.BindingType;

//SEI實現類
//@WebService表示該類是個服務類,需要釋出其中的public方法
@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)(jdk1.6需要宣告,否則啟動會報錯,jdk1.7就不需要了)
//如何實現釋出soap1.2版本協議的服務端程式(Jaxws不支援SOAP1.2服務端釋出,如果想釋出SOAP1.2服務端,需要在服務端引入第三方JAR(jaxws-ri-2.2.8))
//@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
public class WeatherInterfaceImpl implements WeatherInterface {

	@Override
	public String queryWeather(String cityName) {
		System.out.println("from client...."+cityName);
		String weather="晴";
		return weather;
	}

}

第三步釋出服務,Endpoint釋出服務,publish方法,兩個引數:1.服務地址2.服務實現類 

package cn.itcast.ws.jaxws.ws;

import javax.xml.ws.Endpoint;

//天氣服務端
//當使用jdk1.6釋出WebService時,如果不指定@SOAPBinding(style = SOAPBinding.Style.RPC)遇到錯誤
public class WeatherServer {

	public static void main(String[] args) {
		//Endpoint釋出服務
		//引數解釋:
		//1.address - 服務地址  
		//2.implementor - 實現類
		Endpoint.publish("http://127.0.0.1:12345/weather", new WeatherInterfaceImpl());
		System.out.println("服務啟動成功......");

	}

}


第四步:測試服務是否釋出成功,通過閱讀使用說明書,確定客戶端呼叫的介面、方法、引數和返回值存在,證明服務釋出成功

  • WSDL地址服務地址+”?wsdl”
  • WSDL閱讀方式:從下往上

3.3.2 客戶端

開發步驟

第一步wsimport命令生成客戶端程式碼(wsimport將在下面詳細介紹)

第二步根據使用說明書,使用客戶端程式碼呼叫服務端

  • 第一步:建立服務檢視檢視是從service標籤的name屬性獲取
  • 第二步獲取服務實現,實現類從portTypename屬性獲取
  •  第三步:獲取查詢方法,從portTypeoperation標籤獲取
package cn.itcast.ws.jaxws.ws.client;

import cn.itcast.ws.jaxws.ws.WeatherInterfaceImpl;
import cn.itcast.ws.jaxws.ws.WeatherInterfaceImplService;

//天氣查詢客戶端
//jdk版本不同利用wsimport命令生成的客戶端程式碼也不相同,但功能一致
public class WeatherClient {

	public static void main(String[] args) {
		//建立服務檢視
		WeatherInterfaceImplService weatherInterfaceImplService = new WeatherInterfaceImplService();
		//獲取服務實現類
		WeatherInterfaceImpl weatherInterfaceImpl = weatherInterfaceImplService.getPort(WeatherInterfaceImpl.class);
		//呼叫查詢方法,列印
		String weather = weatherInterfaceImpl.queryWeather("北京");
		System.out.println("客戶端呼叫伺服器端成功...........");
		System.out.println("查詢出的天氣資訊為:"+weather);
	}

}

3.4 Webservice的優缺點

優點

  • 傳送方式採用httppost傳送http的預設埠是80,防火牆預設不攔截80所以防火牆
  • 採用XML格式封裝資料XML跨平臺的,所以webservice也可以跨平臺
  • Webservice支援面向物件

缺點

  • 採用XML格式封裝資料,所以在傳輸過程中,要傳輸額外的標籤,隨著SOAP協議不斷完善,標籤越來越大,導致webservice效能下降

Webservice應用場景

4.1 軟體整合和複用

 

4.2 適用場景

  •  釋出一個服務(對內/對外,不考慮客戶端型別,不考慮效能,建議使用webservice
  •  服務端已經確定使用webservice,客戶端不能選擇,必須使用webservice

4.3 不適用場景

  • 考慮效能時不建議使用webservice
  • 同構程式下不建議使用webservice,比如javaRMI不需要翻譯成XML資料

WSDL

5.1 定義

WSDLweb服務描述語言,他是webservice服務端使用說明書,說明服務端介面、方法、引數和返回值,WSDL是隨服務釋出成功,自動生成,無需編寫

5.2 文件結構

 

  • <service>    服務檢視,webservice的服務結點,它包括了服務端點
  • <binding>     為每個服務端點定義訊息格式和協議細節
  • <portType>   服務端點,描述 web service可被執行的操作方法,以及相關的訊息,通過binding指向portType
  • <message>   定義一個操作(方法)的資料引數(可有多個引數)
  • <types>        定義 web service使用的全部資料型別

5.3 閱讀方式從下往上

 

SOAP

6.1 定義

  • SOAP簡單物件訪問協議,他是使用http傳送的XML格式的資料,它可以跨平臺,跨防火牆SOAP不是webservice的專有協議。
  • SOAP=http+xml

 

6.2 協議格式

  • 必需有 Envelope 元素,此元素將整個 XML 文件標識為一條SOAP訊息
  • 可選的 Header 元素,包含頭部資訊
  • 必需有Body 元素,包含所有的呼叫和響應資訊
  • 可選的 Fault 元素,提供有關在處理此訊息所發生錯誤的資訊

6.3 TCP/IP Monitor(瞭解,抓取請求與返回資訊)

6.3.1 代理原理

 

6.3.2 配置

 

6.3.3 測試

瀏覽器中輸入代理服務地址正常訪問,代表代理服務設定成功

 

6.4 SOAP1.1

請求:

POST /weather HTTP/1.1
Accept: text/xml, multipart/related
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://ws.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 214
 
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body><ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><arg0>北京</arg0></ns2:queryWeather>
</S:Body>
</S:Envelope>


響應: 
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: text/xml; charset=utf-8
Date: Thu, 26 Nov 2015 03:14:29 GMT

<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><return>晴</return></ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>


 6.5 SOAP1.2

如何釋出SOAP1.2服務端?

  • Jaxws支援SOAP1.2服務端釋出,直接釋出會報如下異常

                  

  • 如果想釋出SOAP1.2服務端,需要服務端引入第三方JARjaxws-ri-2.2.8
  • 實現類上加入如下註解

@BindingType(SOAPBinding.SOAP12HTTP_BINDING)

請求

POST /weather HTTP/1.1
Accept: application/soap+xml, multipart/related
Content-Type: application/soap+xml; charset=utf-8;
action="http://ws.jaxws.ws.itcast.cn/WeatherInterfaceImpl/queryWeatherRequest"
User-Agent: JAX-WS RI 2.2.4-b01
Host: 127.0.0.1:54321
Connection: keep-alive
Content-Length: 212
 
<?xml version="1.0" ?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body><ns2:queryWeather xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><arg0>北京</arg0></ns2:queryWeather>
</S:Body>
</S:Envelope>


響應 
HTTP/1.1 200 OK
Transfer-encoding: chunked
Content-type: application/soap+xml; charset=utf-8
Date: Thu, 26 Nov 2015 03:25:24 GMT
 
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://www.w3.org/2003/05/soap-envelope">
<S:Body>
<ns2:queryWeatherResponse xmlns:ns2="http://ws.jaxws.ws.itcast.cn/"><return>晴</return></ns2:queryWeatherResponse>
</S:Body>
</S:Envelope>


6.6 SOAP1.1SOAP1.2區別 

相同點

  • 請求傳送方式相同:都是使用POST
  • 協議內容相同:都有EnvelopeBody標籤

 不同點

  • 資料格式不同:content-type不同

SOAP1.1:text/xml;charset=utf-8

SOAP1.2:application/soap+xml;charset=utf-8

  • 名稱空間不同:

SOAP1.1:http://schemas.xmlsoap.org/soap/envelope/

SOAP1.2:http://www.w3.org/2003/05/soap-envelope

 7 UDDI

UDDI 是一種目錄服務,企業可以使用它對 Web services 進行註冊和搜尋。UDDI,英文為"Universal Description, Discovery and Integration",可譯為通用描述、發現與整合服務

UDDI 並不像 WSDL SOAP 一樣深入人心,因為很多時候,使用者知道 Web服務的位置(通常位於公司的企業內部網中)。

課程回顧

什麼webservice?”

  • 什麼是遠端呼叫,系統和系統之間的呼叫從遠端系統當中獲取業務資料
  • Webserviceweb服務,他是用http傳輸SOAP協議資料的一種遠端呼叫技術

Webservice入門程式

服務端

  • 第一步建立SEI介面
  • 第二步:建立SEI實現類,要在類上加入@WebService
  • 第三步釋出服務Endpointpublish方法,2兩個引數:1.服務地址;2.實現類例項
  • 第四步:測試服務是否釋出成功,通過閱讀使用說明書,確定服務介面、方法、引數、返回值存在,說明服務釋出成功。

WSDL地址服務地址+”?wsdl”

WSDL閱讀方式,下往上,servvice->binding->portType->其中有介面、方法、引數和返回值

客戶端

  • 第一步:使用wsimport生成客戶端程式碼
  • 第二步根據使用說明書,使用客戶端呼叫服務端
  • 建立服務檢視,檢視是從servicename屬性獲取
  • 獲取服務實現類,portTypename屬性獲取
  • 呼叫查詢方法,從portType下operation標籤的name屬性獲取

優缺點

  • 傳送方式採用httpposthttp預設埠是80所以跨越防火牆
  • 資料封裝使用XML格式XML跨平臺,所以webservice可以跨平臺
  • Webservice支援面向物件開發

Webservice應用場景

軟體整合和複用

適用場景

  • 釋出服務(對內/對外不考慮效能,不考慮客戶端型別,建議使用webservice
  • 服務端已確定使用webservice客戶端只能使用webservice

不適用場景:

  • 考慮效能時,不建議使用webservice
  • 同構程式下,不建議使用webservice,比如客戶端服務都是java開發,建議Java RMI

WSDL

定義WSDLWeb服務描述語言他是webservice服務端的使用說明書他說服務端介面、方法、引數和返回值,他是隨服務釋出成功,自動生成,無需編寫

文件結構:

  • Service
  • Binding
  • portType
  • message
  • types

 閱讀方式:從下往上

SOAP

定義SOAP簡單物件訪問協議,他是使用http傳送的XML格式的資料,跨平臺、跨防火牆不是webservice的專有協議

SOAP=http+xml

協議的格式:

  • 必須有envelopebody
  • 必有:headerfault

 SOAP1.11.2區別

相同點

  • 使用httpPOST傳送請求
  • 協議的格式都相同:都有envelope標籤和body標籤

不同點

Content-type

SOAP1.1text/xml;charset=utf-8;

SOAP1.2:application/soap+xml;charset=utf-8

 名稱空間不同:

UDDI一個目錄服務,提供搜尋和註冊功能,因為不常用,所以瞭解下就可以了

9 Webservice的四種客戶端呼叫方式

公網服務地址:

9.1 第一種生成客戶端呼叫方式

9.1.1 Wsimport命令介紹

  • Wsimport就是jdk提供的一個工具作用就是根據WSDL地址生成客戶端程式碼
  • Wsimport位置JAVA_HOME/bin
  • Wsimport常用的引數:

-s,生成java檔案的

-d,生成class檔案的,預設的引數(即無論寫不寫都會有class檔案生成

-p指定包名的,如果不加該引數,預設包名就是wsdl文件中的名稱空間的倒序(-p如果使用一定要放在-s和-d前

  • Wsimport僅支援SOAP1.1客戶端的生成

9.1.2 呼叫公網手機號歸屬地查詢服務

第一步wsimport生成客戶端程式碼

wsimport -p cn.itcast.mobile -s . http://webservice.we
bxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl


 第二步閱讀使用說明書,使用生成客戶端程式碼呼叫服務端 

package cn.itcast.mobile.client;

import cn.itcast.mobile.MobileCodeWS;
import cn.itcast.mobile.MobileCodeWSSoap;

//公網手機號查詢客戶端
public class MobileClient {

	public static void main(String[] args) {
		//建立服務試圖
		MobileCodeWS mobileCodeWS = new MobileCodeWS();
		//獲取服務實現累
		MobileCodeWSSoap mobileCodeWSSoap = mobileCodeWS.getPort(MobileCodeWSSoap.class);
		//使用查詢方法
		String mobileInfo = mobileCodeWSSoap.getMobileCodeInfo("18895626618", "");
		
		System.out.println(mobileInfo);
	}

}

9.1.3 公網天氣服務端查詢

會提示報錯,把wsdl網頁另存到本地,然後刪除無法解析的部分

D:\Workspaces\傳智播客webservice學習\wsimport\src>wsimport -p cn.itcast.weather 
 -s . file:///C:\Users\Administrator\Desktop\WeatherWS.asmx.xml

package cn.itcast.weather.client;
import java.util.List;

import cn.itcast.weather.ArrayOfString;
import cn.itcast.weather.WeatherWS;
import cn.itcast.weather.WeatherWSSoap;

//公網天氣查詢客戶端
public class WeatherClient {

	public static void main(String[] args) {
		WeatherWS weatherWS = new WeatherWS();
		WeatherWSSoap weatherWSSoap = weatherWS.getPort(WeatherWSSoap.class);
		
		ArrayOfString arrayOfString = weatherWSSoap.getWeather("廣州", "");
		List<String> list = arrayOfString.getString();
		
		for(String str : list){
			System.out.println(str);
		}
	}

}

9.1.4 特點

該種方式使用簡單,但一些關鍵的元素在程式碼生成時寫死到生成程式碼中不方便維護所以僅用於測試。

10 第二種:service程式設計呼叫方式

import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

import cn.itcast.mobile.MobileCodeWSSoap;


//service方式程式設計webservice
//注意也需要生成客戶端,只是不通過自己生成的客戶端來建立檢視
public class MobileClient {

	public static void main(String[] args) {
		//建立wsdl的url,注意不是服務地址
		URL wsdlDocumentLocation=null;
		try {
			wsdlDocumentLocation = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL");
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//建立服務名稱
		//1.namespaceURI - 名稱空間地址
		//2.localPart - 服務檢視名
		QName serviceName = new QName("http://WebXml.com.cn/", "MobileCodeWS");
		
		//建立服務檢視
		//引數解釋
		//1.wsdlDocumentLocation - wsdl地址
		//2.serviceName - 服務名稱
		Service service = Service.create(wsdlDocumentLocation, serviceName);
		
		//獲取服務實現類
		MobileCodeWSSoap mobileCodeWSSoap = service.getPort(MobileCodeWSSoap.class);
		String mobileInfo = mobileCodeWSSoap.getMobileCodeInfo("18888888888", "");
		System.out.println(mobileInfo);
	}

}

10.1 特點 

該種方式可以自定義關鍵元素,方便以後維護,是一種標準的開發方式

11 第三種HttpURLConnection呼叫方式

開發步驟:

第一步建立服務地址

第二步開啟一個通向服務地址的連線

第三步設定引數

設定POSTPOST必須大寫,如果不大寫,報如下異常

       

如果不設定輸入輸出,會報如下異常

     

第四步組織SOAP資料傳送請求

第五步:接收服務端響應列印

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;


//利用HttpURLConnection呼叫方式(可以不生成客戶端)
public class HttpCilent {

	public static void main(String[] args) throws IOException {
		//第一步:建立服務地址,注意是服務地址不是wsdl地址
		URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx");
		
		//第二步:開啟一個通向服務地址的連線
		HttpURLConnection httpURLConnenction = (HttpURLConnection)url.openConnection();

		//第三步:設定引數
		//3.1傳送方式設定:POST
		httpURLConnenction.setRequestMethod("POST");
		
		//3.2設定資料格式:content-type
		httpURLConnenction.setRequestProperty("content-type", "text/xml;charset=utf-8");
		
		//3.3設定輸入和輸出,因為預設新建立httpURLConnenction沒有讀寫許可權
		httpURLConnenction.setDoInput(true);
		httpURLConnenction.setDoOutput(true);
		
		//第四步:組織SOAP資料,傳送請求
		String soapXML = getXML("15226466316");

		OutputStream os = httpURLConnenction.getOutputStream();
		os.write(soapXML.getBytes());
		
		//第五步:接受伺服器相應,列印
		int responseCode = httpURLConnenction.getResponseCode();
		if(responseCode == 200){  //表示服務端相相應成功
			InputStream is = httpURLConnenction.getInputStream();
			//is.read();這種直接操作二進位制容易出現亂碼
			//字元流(裝飾設計模式)
			InputStreamReader isr = new InputStreamReader(is);
			BufferedReader br = new BufferedReader(isr);
			
			StringBuilder sb = new StringBuilder();
			String temp = null;
			while((temp= br.readLine()) != null){
				sb.append(temp);
			}
			System.out.println(sb.toString());
			
			
			br.close();
			isr.close();
			is.close();
			os.close();
			
		}
		
	}
	/**
	 * <?xml version="1.0" encoding="utf-8"?>
		<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  		<soap:Body>
    		<getMobileCodeInfo xmlns="http://WebXml.com.cn/">
      			<mobileCode>string</mobileCode>
      			<userID>string</userID>
    		</getMobileCodeInfo>
  		</soap:Body>
		</soap:Envelope>
	 */
	public static String getXML(String phoneNum){
		//模擬生成xml
		String soapXML="<?xml version=\"1.0\" encoding=\"utf-8\"?>"
		+"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
  		+"<soap:Body>"
    		+"<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">"
      			+"<mobileCode>"+phoneNum+"</mobileCode>"
      			+"<userID></userID>"
    		+"</getMobileCodeInfo>"
  		+"</soap:Body>"
		+"</soap:Envelope>";
		
		return soapXML;
	}
}

12 Ajax呼叫方式

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script type="text/javascript">
	function queryMobile(){
		//建立XMLHttpRequest物件(這裡沒有考慮瀏覽器相容問題)
		var xhr = new XMLHttpRequest();
		//開啟連線
		xhr.open("post","http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx",true);
		//設定資料型別
		xhr.setRequestHeader("content-type","text/xml;charset=utf-8");
		//設定回撥函式
		xhr.onreadystatechange=function(){
			//判斷是否傳送成功和判斷服務端是否響應成功
			if(4 == xhr.readyState && 200 == xhr.status){
				alert(xhr.responseText);
			}
		}
		//組織SOAP協議資料
		var soapXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
		+"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
			+"<soap:Body>"
		    +"<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">"
		    	+"<mobileCode>"+document.getElementById("phoneNum").value+"</mobileCode>"
		      +"<userID></userID>"
		    +"</getMobileCodeInfo>"
		  +"</soap:Body>"
		+"</soap:Envelope>";
		alert(soapXML);
		//傳送資料
		xhr.send(soapXML);
	}
  </script>
 </head>
 <body>
  手機號查詢:<input type="text" id="phoneNum"/> <input type="button" value="查詢" onclick="javascript:queryMobile();"/>
 </body>
</html>

13 深入開發:用註解修改WSDL內容

WebService的註解都位於javax.jws包下:

[email protected]定義服務,在public class上邊

  • targetNamespace:指定名稱空間
  • nameportType的名稱
  • portNameport的名稱
  • serviceName:服務名稱
  • endpointInterfaceSEI介面地址,如果一個服務類實現了多個介面,只需要釋出一個介面的方法,可通過此註解指定要釋出服務的介面。

[email protected]定義方法,在公開方法上邊

  • operationName:方法名
  • exclude:設定為true表示此方法不是webservice方法,反之則表示webservice方法,預設是false

[email protected]定義返回值,在方法返回值前邊

  • name:返回結果值的名稱

[email protected]定義引數,在方法引數前邊

  • name:指定引數的名稱

作用:

通過註解,可以更加形像的描述Web服務。對自動生成的wsdl文件進行修改,為使用者提供一個更加清晰的wsdl文件。

當修改了WebService註解之後,會影響客戶端生成的程式碼。呼叫的方法名和引數名也發生了變化

package cn.itcast.ws.jaxws.ws;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.xml.ws.BindingType;

//SEI實現類
//@WebService表示該類是個服務類,需要釋出其中的public方法(要不要wsdl優化@WebService都必須要有
@WebService(targetNamespace="http://service.cn.itcast",
		name="WeatherWSSoap",
		portName="WeatherWSSoapPort",
		serviceName="WeatherWS")
@SOAPBinding(style = SOAPBinding.Style.RPC)
//如何實現釋出soap1.2版本協議的服務端程式(Jaxws不支援SOAP1.2服務端釋出,如果想釋出SOAP1.2服務端,需要在服務端引入第三方JAR(jaxws-ri-2.2.8))
//@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
public class WeatherInterfaceImpl implements WeatherInterface {

	@WebMethod(
			operationName="getWeather",
			exclude=false
			)
	@Override
	public @WebResult(name="result")String queryWeather(@WebParam(name="cityName") String cityName) {
		System.out.println("from client...."+cityName);
		String weather="晴";
		return weather;
	}

}