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要麼不配置,要麼必須同時在接口和實現類上配置。