1. 程式人生 > >Web Service進階 五 SOAPBinding方式講解

Web Service進階 五 SOAPBinding方式講解

Web Service進階(五)SOAPBinding方式講解

  Java API for XML Web Services (JAX-WS) 2.0 (JSR 224) Standard Implementation (SI)
  JAX-WS2.0是JAX-RPC 1.1 (JSR 101)的後續版本。

1. JAX-WS 仍然支援 SOAP 1.1 over HTTP 1.1,因此互操作性將不會受到影響,仍然可以在網上傳遞相同的訊息。
2. JAX-WS 仍然支援 WSDL 1.1,因此您所學到的有關該規範的知識仍然有用。WSDL 2.0 規範已經接近完成,但在 JAX-WS 2.0 相關工作結束時其工作仍在進行中。
3. JAX-RPC 和 JAX-WS 都支援 SOAP 1.1。JAX-WS 還支援 SOAP 1.2。
4. WSDL 1.1 規範在 HTTP 繫結中定義,這意味著利用此規範可以在不使用 SOAP 的情況下通過 HTTP 傳送 XML 訊息。
5. JAX-RPC 忽略了 HTTP 繫結。而 JAX-WS 添加了對其的支援。
6. JAX-RPC 支援 WS-I Basic Profile (BP) V1.0。JAX-WS 支援 BP 1.1。(WS-I 即 Web 服務互操作性組織。)

  在JAX-WS時代,wscompile已經被wsimport與wsgen代替。wsimport用於匯入wsdl並生成可移植性元件(artifact)wsgen生成編譯後的SEI並生成可移植性元件(artifact). 當前wsgen並不產生wsdl.WSDL在部署的時候產生。但通過配置項可讓wsgen產生wsdl。
wscompile主於用於早期的RPC,使用wscompile需要編寫一個config.xml檔案,作為wscompile的輸入。

  昨天在GF3上部署webservice,在webserivce上添加了SOAPBinding(style=Style.RPC),[這個annotation最好寫在類層次上,寫在方面層次上容易與出現與類出現衝突],結果部署失敗。後來發現寫成SOAPBinding(style=Style.RPC,use=literal)才可以。從Google上找到一點證據:RPC/encoded is not a supported style/use mode with JAX-WS 2.0. JAX-WS2.0 is fully compliant with the WS-I Basic Profile 1.1 which mandates literal mode. The supported style/use modes are: rpc/literal and document/literal. 

  JAX-WS 中的SoapBinding目前支援3種方式:

1)Document Wrapped(預設使用方式,由下面的錯誤可見):
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)
2)Document Bare:
@SOAPBinding(style=SOAPBinding.Style.DOCUMENT,use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.ParameterStyle.BARE)


3)RPC:
@SOAPBinding(style=SOAPBinding.Style.RPC,use=SOAPBinding.Use.LITERAL,parameterStyle=SOAPBinding.ParameterStyle.WRAPPED)

  另外 The java.util.Collection classes cannot be used with rpc/literal or document/literal BARE style due to a limitation in JAXB. However, they do work in the default document/literal WRAPPED style

  本文上半部分出自 “天下無賊” 部落格,請務必保留此出處http://guojuanjun.blog.51cto.com/277646/1196736

  本文下半部分為作者原創內容,轉載時請註明出處,維護著作權,從你我做起,從身邊做起!

  為了更形象具體的解釋以上三種繫結方式,作者採用示例程式碼的形式進行演示,並對三種繫結方式進行對比。

1)Document Wrapped:

//它是一個註解,用在類上指定將此類釋出成一個ws.
//修改目標空間,修改服務名,埠名.在wsdl那裡的xml檔案顯示對應的修改資訊
@WebService(targetNamespace = "http://ujn.cn/",serviceName = "UserService", portName = "UserPort")
public interface UserService {
// 新增使用者
@WebMethod
@ResponseWrapper(localName = "add_Status", targetNamespace = "http://ujn.cn/", className = "cn.ujn.edu.dto.User")
@RequestWrapper(localName = "userInfo", targetNamespace = "http://ujn.cn/", className = "cn.ujn.edu.dto.User")
@WebResult(name="add_Status")
public int add(String userStr);
// 查詢使用者
@WebMethod
@WebResult(name="login_Status")
public int login(String userStr);
}

  剛開始寫註解的時候,感覺應該會很簡單,其實不然。對於這三種繫結方式,我們首先應該考慮應用場景,針對不同的應用場景選擇不同的繫結形式。後面會具體分析繫結方式的選擇問題。

  在Document wrapped方式中,我們設定的@WebResult(name="add_Status")和@WebParam(name="userInfo")其中的name屬性值必須進行包裝,相關程式碼

// 新增使用者

<span style="font-size:18px;">@WebMethod
	@ResponseWrapper(localName = "add_Status", targetNamespace = "http://ujn.cn/", className = "cn.edu.ujn.dto.User")
	@RequestWrapper(localName = "userInfo", targetNamespace = "http://ujn.cn/", className = "cn.edu.ujn.dto.User")
	@WebResult(name="add_Status")
	public int add(@WebParam(name="userInfo")String userStr);</span>
<span style="font-size:18px;">其中,相應包裝類為className = "cn.edu.ujn.dto.User",其具體內容如下:</span>
<span style="font-size:18px;">public class User {
	private String userInfo;
	private String login_Status;
	public String getUserInfo() {
		return userInfo;
	}
	public void setUserInfo(String userInfo) {
		this.userInfo = userInfo;
	}
	public String getLogin_Status() {
		return login_Status;
	}
	public void setLogin_Status(String login_Status) {
		this.login_Status = login_Status;
	}
}</span>
<span style="font-size:18px;">在進行引數名的替換時,會將localName = "userInfo"在className = "cn.edu.ujn.dto.User"中匹配,若匹配成功,則進行替換操作,替換後的效果可以在wsdl檔案中檢視,如下圖1-1所示,否則編譯器會報如圖1-2所示的錯誤:</span>

 

 
 

 

圖1-1 wsdl文件

圖1-2 錯誤提示

  出現此錯誤的原因正是因為所定義的變數userInfo1未存在於包裝類user中。

此種繫結形式的缺點是在進行引數初始化時需進行兩次new操作(分別為in和out階段),浪費記憶體,當然可以考慮使用工廠設計模式。

  注:在進行重複部署服務的時候,應當將Tomcat容器中的web專案刪除,否則會因為快取的原因而看不到新部署的服務效果。

2)DocumentBare

其指定形式如下:

<span style="font-size:18px;">public interface UserService {
	// 新增使用者
	@WebMethod
	@WebResult(name="add_Status")
	public int add(@WebParam(name="userInfo")String userStr);
	// 查詢使用者
	@WebMethod
	@WebResult(name="login_Status")
	public int login(@WebParam(name="userInfo")String userStr);
}</span>
<span style="font-size:18px;">其中,最重要的引數設定是紅色部分的內容。此種方式對於資料型別簡單如int、String、array型別的資料使用,對於list、map等集合複雜型別的資料不適用。此種形式的優點是節省記憶體。</span>
3)RPC

 

其指定形式如下:

public interface UserService {

// 新增使用者

@WebMethod

@WebResult(name="add_Status")

public int add(@WebParam(name="userInfo")String userStr);

// 查詢使用者

@WebMethod

@WebResult(name="login_Status")

public int login(@WebParam(name="userInfo")String userStr);

}

  至此,示例程式碼演示到此。希望朋友們可以有所受益!

美文美圖



再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!希望你也加入到我們人工智慧的隊伍中來!http://www.captainbed.net