Web Service 那點事兒

來源:互聯網
上載者:User
Web Service 那點事兒(1) 原文地址:http://my.oschina.net/huangyong/blog/286155

目錄[-] 1. 使用 JDK 發布 WS 2. 通過用戶端調用 WS 3. 總結

Web Service,即“Web 服務”,簡寫為 WS,從字面上理解,它其實就是“基於 Web 的服務”。而服務卻是雙方的,有服務需求方,就有服務提供者。服務提供者對外發布服務,服務需求方調用服務提供者所發布的服務。其實也就是這些了,沒有多少高大上的東西。

本文將從實戰的角度,描述使用 Java 開發 WS 的工具及其使用過程。

如果說得再專業一點,WS 其實就是建立在 HTTP 協議上實現異構系統通訊的工具。沒錯。WS 說白了還是基於 HTTP 協議的,也就是說,資料是通過 HTTP 進行傳輸的。

自從有了 WS,異構系統之間的通訊不再是遙不可及的夢想。比如:可在 PHP 系統中調用 Java 系統對外發布的 WS,擷取 Java 系統中的資料,或者把資料推送到 Java 系統中。

如果您想瞭解更多關於 WS 的那些概念與術語,可以看看下面的百度百科:

http://baike.baidu.com/view/67105.htm

今天我想與大家分享的主題是,如何在 Java 中發布與調用 WS。希望本文能夠對您有所協助。 1. 使用 JDK 發布 WS

第一步:您要做的第一件事情就是,寫一個服務介面。

package demo.ws.soap_jdk;import javax.jws.WebService;@WebServicepublic interface HelloService {    String say(String name);}

在介面上放一個 WebService 註解,說明該介面是一個 WS 介面(稱為“Endpoint,端點”),其中的方法是 WS 方法(稱為“Operation,操作”)。

第二步:實現這個 WS 介面,在實作類別中完成具體商務邏輯,為了簡單,我們還是寫一個 Hello World 意思一下吧。

package demo.ws.soap_jdk;import javax.jws.WebService;@WebService(    serviceName = "HelloService",    portName = "HelloServicePort",    endpointInterface = "demo.ws.soap_jdk.HelloService")public class HelloServiceImpl implements HelloService {    public String say(String name) {        return "hello " + name;    }}

第三步:寫一個 Server 類,用於發布 WS,直接使用 JDK 提供的工具即可實現。

package demo.ws.soap_jdk;import javax.xml.ws.Endpoint;public class Server {    public static void main(String[] args) {        String address = "http://localhost:8080/ws/soap/hello";        HelloService helloService = new HelloServiceImpl();        Endpoint.publish(address, helloService);        System.out.println("ws is published");    }}

只需使用 JDK 提供的 javax.xml.ws.Endpoint 即可發布 WS,只需提供一個 WS 的地址(address),還需提供一個服務執行個體(helloService)。

現在您就可以運行 Server 類的 main 方法了,會在控制台裡看到“ws is published”的提示,此時恭喜您,WS 已成功發布了。

第四步:開啟您的瀏覽器,在地址欄中輸入以下地址:

http://localhost:8080/ws/soap/hello?wsdl

注意:以上地址後面有一個 ?wsdl 尾碼,在 Server 類中的 address 裡卻沒有這個尾碼。此時,在瀏覽器中會看到如下 XML 文檔:

當看到這份 WSDL 文檔時,也就意味著,您發布的 WS 服務現在可以被別人使用了。 2. 通過用戶端調用 WS

第一步:使用 JDK 提供的命令列工具產生 WS 用戶端 jar 包。

JDK 安裝目錄下有個 bin 目錄,裡面存放了大量的命令列工具,只要您的 Path 環境變數指向了該路徑,就能在命令控制台上使用 JDK 提供的相關命令。

其中,有一個名為 wsimport 的命令列工具,正是用來通過 WSDL 產生 WS 用戶端代碼的,您只需要輸入以下命令即可:

wsimport http://localhost:8080/ws/soap/hello?wsdljar -cf client.jar .rmdir /s/q demo

對以上三行命令解釋如下: 第一行:通過 WSDL 地址產生 class 檔案 第二行:通過 jar 命令將若干 class 檔案壓縮為一個 jar 包 第三行:刪除產生的 class 檔案(刪除根目錄即可)

最終您將會得到一份名為 client.jar 的 jar 包,將這個 jar 包配置到您的 classpath 中,方便在下面的代碼中使用其中的類。

技巧:可以將以上三行命令放入一個 bat 檔案中,在 Windows 中雙擊即可運行。

第二步:寫一個 Client 類,用於調用 WS,需要使用上一步產生的 WS 用戶端 jar 包。

package demo.ws.soap_jdk;public class Client {    public static void main(String[] args) {        HelloService_Service service = new HelloService_Service();        HelloService helloService = service.getHelloServicePort();        String result = helloService.say("world");        System.out.println(result);    }}

以上這段代碼稍微有點怪異,其中 HelloService_Service 是 jar 包中類,可以將其理解為 WS 的工廠類,通過它可以產生具體的 WS 介面,比如,調用 service.getHelloServicePort() 方法,就擷取了一個 HelloService 執行個體,正是通過這個執行個體來調用其中的方法。

運行 Client 類的 main 方法,就會看到您所期望的結果“hello world”了,不妨親自嘗試一下吧。

可見,這是一個典型的“代理模式”應用情境,您實際是面向代理對象來調用 WS 的,並且這是一種“靜態代理”,下面我們來談談,如何使用“動態代理”的方式來調用 WS。

其實 JDK 已經具備了動態代理的功能,對於 WS 而言,JDK 同樣也提供了很好的工具,就像下面這段代碼那樣:

package demo.ws.soap_jdk;import java.net.URL;import javax.xml.namespace.QName;import javax.xml.ws.Service;public class DynamicClient {    public static void main(String[] args) {        try {            URL wsdl = new URL("http://localhost:8080/ws/soap/hello?wsdl");            QName serviceName = new QName("http://soap_jdk.ws.demo/", "HelloService");            QName portName = new QName("http://soap_jdk.ws.demo/", "HelloServicePort");            Service service = Service.create(wsdl, serviceName);            HelloService helloService = service.getPort(portName, HelloService.class);            String result = helloService.say("world");            System.out.println(result);        } catch (Exception e) {            e.printStackTrace();        }    }}

此時,只需在本地提供一個 HelloService 的介面,無需 client.jar,直接面向 WSDL 編程,只不過您需要分別定義出 serviceName 與 portName 這兩個東西,最後才能調用 JDK 提供的 javax.xml.ws.Service 類產生 service 對象,它同樣是一個工廠對象,通過該工廠對象擷取我們需要的 HelloService 執行個體。貌似這種方式也不是特別動態,畢竟 HelloService 介面還是需要自行提供的。 3. 總結

通過本文,您可以瞭解到,不僅可以使用 JDK 發布 WS,也可以使用 JDK 調用 WS,這一切都是那麼的簡單而自然。但需要注意的是,這個特性是從 JDK 6 才開始提供的,如果您還在使用 JDK 5 或更低的版本,那就很遺憾了,您不得不使用以下工具來發布與調用 WS,它們分別是: JAX-WS RI:https://jax-ws.java.net/ Axis:http://axis.apache.org/ CXF:http://cxf.apache.org/

當然,發布與調用 WS 的工具不僅僅只有以上這些,而是它們是 Java 世界中最優秀的 WS 開源項目。

本文講述的 WS 其實是一種 Java 規範,名為 JAX-WS(JSR-224),全稱 Java API for XML-Based Web Services,可以將規範理解為官方定義的一系列介面。

JAX-WS 有一個官方實現,就是上面提到的 JAX-WS RI,它是 Oracle 公司提供的實現,而 Apache 旗下的 Axis 與 CXF 也同樣實現了該規範。Axis 相對而言更加老牌一些,而 CXF 的前世就是 XFire,它是一款著名的 WS 架構,擅長與 Spring 整合。

從本質上講,JAX-WS 是基於 SOAP 的,而 SOAP 的全稱是 Simple Object Access Protocol(簡易物件存取通訊協定 (SOAP)),雖然名稱裡帶有“簡單”二字,其實並不簡單,不相信您可以百度一下。

為了讓 WS 的開發與使用變得更加簡單、更加輕量級,於是出現了另一種風格的 WS,名為 JAX-RS(JSR-339),全稱 Java API for RESTful Web Services,同樣也是一種規範,同樣也有若干實現,它們分別是: Jersey:https://jersey.java.net/ Restlet:http://restlet.com/ RESTEasy:http://resteasy.jboss.org/ CXF:http://cxf.apache.org/

其中,Jersey 是 Oracle 官方提供的實現,Restlet 是最老牌的實現,RESTEasy 是 JBoss 公司提供的實現,CXF 是 Apache 提供的實現(上文已做介紹)。

可見,CXF 不僅用於開發基於 SOAP 的 WS,同樣也適用於開發基於 REST 的 WS,這麼好的架構我們怎能錯過。

如何使用 CXF 簡化我們的 WS 開發。我們下期再見。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.