(二)JDK原生支持的WebService協議文件分析及個性化定製

1.分析協議文件

上一章發佈了WS服務,於是在瀏覽器地址欄輸入http://localhost:8888/msg?wsdl訪問,將得到如下協議文件,該協議文件不僅是WS客戶端調用程序員參考手冊,同時也是生成WS客戶端調用代碼必不可少的依據

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
	xmlns:tns="http://ws.cjc.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.cjc.cn/"
	name="MessageImplService">
	<types></types>
	<message name="getMsg">
		<part name="arg0" type="xsd:string"></part>
	</message>
	<message name="getMsgResponse">
		<part name="return" type="xsd:string"></part>
	</message>
	<portType name="Message">
		<operation name="getMsg" parameterOrder="arg0">
			<input message="tns:getMsg"></input>
			<output message="tns:getMsgResponse"></output>
		</operation>
	</portType>
	<binding name="MessageImplPortBinding" type="tns:Message">
		<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
			style="rpc"></soap:binding>
		<operation name="getMsg">
			<soap:operation soapAction=""></soap:operation>
			<input>
				<soap:body use="literal" namespace="http://ws.cjc.cn/"></soap:body>
			</input>
			<output>
				<soap:body use="literal" namespace="http://ws.cjc.cn/"></soap:body>
			</output>
		</operation>
	</binding>
	<service name="MessageImplService">
		<port name="MessageImplPort" binding="tns:MessageImplPortBinding">
			<soap:address location="http://localhost:8888/msg"></soap:address>
		</port>
	</service>
</definitions>


對這個文件從下往上分析,service標籤表示服務名稱,在客戶端調用代碼中對應cn.cjc.ws.MessageImplService類,該標籤下的子標籤port在客戶端調用代碼中對應cn.cjc.ws.MessageImplService#getMessageImplPort方法,該方法用來獲取服務接口。binding標籤是連接service標籤和portType標籤的橋樑,portType標籤在客戶端調用代碼中對應cn.cjc.ws.Message接口,剩下的多個message接口用來說明方法參數類型和返回值類型。

2.個性化協議文件

a)接口上的註解添加如下屬性

package cn.cjc.ws;

import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService(name = "name")
// jdk1.6.0_22版本以下的不加這個註解可能無法發佈WS服務
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface Message {
	String getMsg(@WebParam(name = "username") String name);
}

b)實現類上的註解添加如下屬性

package cn.cjc.ws;

import javax.jws.WebService;

@WebService(endpointInterface = "cn.cjc.ws.Message", portName = "portName", serviceName = "serviceName")
public class MessageImpl implements Message {
	@Override
	public String getMsg(String name) {
		return name + ",歡迎學習WebService";
	}
}

c)發佈服務然後在瀏覽器重新生成的協議文件如下

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
	xmlns:tns="http://ws.cjc.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://ws.cjc.cn/"
	name="serviceName">
	<types></types>
	<message name="getMsg">
		<part name="username" type="xsd:string"></part>
	</message>
	<message name="getMsgResponse">
		<part name="return" type="xsd:string"></part>
	</message>
	<portType name="name">
		<operation name="getMsg" parameterOrder="username">
			<input message="tns:getMsg"></input>
			<output message="tns:getMsgResponse"></output>
		</operation>
	</portType>
	<binding name="portNameBinding" type="tns:name">
		<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
			style="rpc"></soap:binding>
		<operation name="getMsg">
			<soap:operation soapAction=""></soap:operation>
			<input>
				<soap:body use="literal" namespace="http://ws.cjc.cn/"></soap:body>
			</input>
			<output>
				<soap:body use="literal" namespace="http://ws.cjc.cn/"></soap:body>
			</output>
		</operation>
	</binding>
	<service name="serviceName">
		<port name="portName" binding="tns:portNameBinding">
			<soap:address location="http://localhost:8888/msg"></soap:address>
		</port>
	</service>
</definitions>


對應着之前的那份協議文件可以發現,WebService註解中的name屬性改變portType標籤,serviceName屬性改變service標籤,portName屬性改變port標籤

其實WebService註解共有6個屬性,endpointInterface、serviceName、portName只能用在實現類上,另外3個是name、targetNamespace、wsdlLocation接口和實現類都可以用,需要注意的是,targetNamespace要麼不配置,要麼必須同時在接口和實現類上配置。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章