JDK1.6整合的JAX-WS開發webservice
下面我們開始構建:
1,先用Eclipse建立一個動態網站,注意需要生成web.xml,建工程的時候不要忘記勾選;
2,建立類實現Web Services介面,下面是一個簡單定義Web Services介面的實現類:
程式碼
package javaWebServiceTest;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.WebParam.Mode;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.jws.soap.SOAPBinding.Use;
import webServiceInterface.Person;
@WebService(name="SayHello", portName="SayHellowServicePort", serviceName="SayHelloServiceName",
targetNamespace="http://www.webservice.com")
@SOAPBinding(style = Style.RPC,use = Use.LITERAL)
public class ChService {
@WebMethod(action="sayHello", operationName="saySomeWord")
@WebResult(name="Person", partName="PersonName")
public Person sayHelloWord(@WebParam(name="paramA", partName="p1", mode = Mode.IN)String name){
Person persons = new Person();
persons.setName("My name is " +name);
return persons;
}
}
3,Person類
package webServiceInterface;
public class Person
{
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
這樣,我們基本上就實現了webservice的構建,是不是感覺不是很難,跟寫普通的java方法一樣,其實jdk自帶的webservice是通過註釋注入方法實現的。所以上面那些以"@"符號開頭的都是非常重要的,也是必須的。
下面我們來配置我們寫的WebService到Apache中:
1,上面第一步,我們生成了一個web.xml類,我們向<web-app>節點裡面加入以下內容:
程式碼<listener>
<listener-class>
com.sun.xml.ws.transport.http.servlet.WSServletContextListener
</listener-class>
</listener>
<servlet>
<servlet-name>TestService</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestService</servlet-name>
<url-pattern>/jdkService</url-pattern>
</servlet-mapping>
2,在web.xml的目錄中再建立一個sun-jaxws.xml來配置endpoint的相關內容。
程式碼
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime' version='2.0'>
<endpoint
name='TestService'
implementation='javaWebServiceTest.ChService'
binding="http://java.sun.com/xml/ns/jaxws/2003/05/soap/bindings/HTTP/"
url-pattern='/jdkService'/>
</endpoints>
好了,配置完了。把我們建立的專案加入到apache7.0中,然後啟動。
如圖:
現在我們來說說那些以"@"符號開頭的內容。
1,@WebService(name="SayHello", portName="SayHellowServicePort", serviceName="SayHelloServiceName", targetNamespace="http://www.possystem.com")
name: SayHello
使用者例項化用,例:
private WinService.SayHelloClient win = new winformService.WinService.SayHelloClient();
WSDL中:<portType name="SayHello">
serviceName: SayHelloServiceName
指定Web Service的名稱 ,WSDL中:<service name="SayHelloServiceName">
portName: SayHellowServicePort
WSDL中:<port name="SayHellowServicePort" binding="tns:SayHellowServicePortBinding">
wsdlLocation:wsdlLocation 是引用預先存在的 WSDL 檔案的 URL(相對或絕對)。
targetNamespace:wsdl名稱空間
2,@SOAPBinding(style = Style.RPC,use = Use.LITERAL)
style: 定義傳送到 Web Service 的訊息和從 Web Service 傳送的訊息的編碼樣式。
Document和RPC兩種形式
預設值:
javax.jws.soap.SOAPBinding.Style.DOCUMENT
use: 定義傳送到 Web Service 的訊息和從 Web Service 傳送的訊息的格式樣式。
ENCODED和 LITERAL兩種形式
預設值:
javax.jws.soap.SOAPBinding.Use.LITERAL
3, @WebMethod(action="sayHello", operationName="saySomeWord")
action: sayHello
此操作的動作。 對於 SOAP 繫結,此方法可確定 soap 動作的值。
WSDL中: <soap12:operation soapAction="sayHello" />
operationName: sayHelloWord1
與此方法匹配的 wsdl:operation 的名稱。
此名稱也用於客戶端呼叫的方法的名稱。
exclude
將某一方法標記為不作為一個 web 方法公開。
4, @WebResult(name="Person", partName="PersonName")
name: Person
返回值的名稱。 如果操作是 rpc 樣式,並且partName尚未指定, 表示此返回值的 wsdl:part 的名稱
WSDL中:<part name="Person" type="tns:person" />
partName: PersonName
表示此返回值的 wsdl:part 的名稱。
此名稱只在操作是 rpc 樣式,或者操作是文件樣式且引數樣式為 BARE 時使用。
WSDL中:<part name="PersonName" type="tns:person" />
5, public Person sayHelloWord(@WebParam(name="paramA", partName="p1", mode = Mode.IN)String name){……}
name: paramA
如果該操作是 rpc 樣式的,並且尚未指定 @WebParam.partName,則此名稱是表示引數的 wsdl:part 的名稱。
如果該操作是文件樣式的,或者引數對映到某一個頭,則此名稱是表示引數的 XML 元素的本地名稱。
如果操作是文件樣式的,引數樣式為 BARE 並且模式為 OUT 或 INOUT,則必須指定一個名稱。
客戶端呼叫時引數名稱顯示該值。
partName: p1
表示此引數的 wsdl:part 的名稱。
此名稱僅在操作是 rpc 樣式,或者操作是文件樣式且引數樣式為 BARE 時使用。
WSDL中:
<message name="sayHelloWord1">
<part name="p1" type="xsd:string" />
</message>
客戶端呼叫時引數名稱顯示該值。
這個主要是根據樣式來。
mode:引數的流向(IN、OUT 或 INOUT 之一)。
轉自http://www.cnblogs.com/blueskyc/archive/2010/12/17/1909335.html