1. 程式人生 > >JDK1.6整合的JAX-WS開發webservice

JDK1.6整合的JAX-WS開發webservice

JDK1.6中自帶了webservice的功能,因為集成了JAX-WS,這非常方便,不用再用第三方包來開發了。

下面我們開始構建:

  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中,然後啟動。

如圖:

http://pic002.cnblogs.com/images/2010/35004/2010121715221382.jpg

現在我們來說說那些以"@"符號開頭的內容。

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