定義
我們經常會聽到,xx項目中用到了Web Service。那麼,什麼是Web Service呢?
首先讓我們來瞭解一下Web Service。Web Service技術,就是能使得運行在不同機器上的不同應用無須藉助附加的、專門的第三方軟體或硬體, 就可相互交換資料或整合。依據Web Service規範實施的應用之間,無論它們所使用的語言、平台或內部協議是什麼,都可以相互交換資料。Web Service是自描述、自包含的可用網路模組,可以執行具體的業務功能。
Web service是一個平台獨立的,低耦合的,自包含的、基於可程式化的web的應用程式,可使用開放的XML(標準通用標記語言 (SGML)下的一個子集)標準來描述、發布、發現、協調和配置這些應用程式,用於開發分布式的互操作的應用程式。
準備
將EJB發布成Web服務,在EJB容器中不是困難的事情,只要容器實現了JavaEE的JAX-WS標準就行了,開發人員要做的就是增加一點點有關WebService的註解,打包發布到應用程式容器即可。
步驟
建立Web Service
服務端不用再強制規定WebService必須實現一個介面了,而一個普通的POJO+EJB註解的類就可以當做WebService伺服器類。
HelloWorld服務端代碼
package com.foshanshop.ws;import javax.jws.WebMethod;import javax.jws.WebService;import javax.jws.soap.SOAPBinding;@WebService(name="HelloWorld",targetNamespace="http://com.foshanshop.ws",serviceName="HelloWorldService")@SOAPBinding(style=SOAPBinding.Style.RPC)public class HelloWorldService {@WebMethodpublic String sayHello(String name) {System.out.println("用戶端調用了伺服器端的代碼");return name + "說:這是一個簡單的Web測試服務!";}}
@WebService 這個注釋放置在 Java 類的前面,聲明這個類的部分方法可以被發布為 Web 服務。@WebService 的屬性用於設定 Web 服務被發布時的一些配置資訊,常用的屬性說明如下 1. nameWeb 服務的名字,WSDL中 wsdl:portType 元素的 name 屬性和它保持一致,預設是 Java 類或者介面的名字。 2. serviceNameWeb 服務的服務名,WSDL 中 wsdl:service 元素的 name 屬性和它保持一致,預設是Java 類的名字+”Service” 。
3. targetNamespaceWSDL檔案所使用的 namespace,該 Web 服務中所產生的其他 XML文檔同樣採用這個作為 namespace 。@SOAPBinding()表示這個服務可以映射到一個 SOAP 訊息中。 Style 用於指定SOAP 訊息請求和回應的編碼方式。@WebMethod 這個注釋放在需要被發布成 Web 服務的方法前面。
Web.xml配置
<servlet> <servlet-name>HelloWorldService</servlet-name> <servlet-class>com.foshanshop.ws.HelloWorldService</servlet-class></servlet><servlet-mapping> <servlet-name>HelloWorldService</servlet-name> <url-pattern>/HelloWorldService/*</url-pattern></servlet-mapping>
定義好Servlet之後,將服務端的類打成war包,部署到JBoss容器中。
注意:POJO endpoint 檔案及 web.xml都是必須的。
經過上面的步驟,完成了一個Web Service 的開發,下面我們通過Jboss管理平台查看剛才發布的 Web Service,開啟連結 http://localhost:8080/jbossws,看到如下介面
點擊“View a list of deployed services”後,就可以看到已經發布的Web Services了,如
在中你可以點擊 ServiceEndpointAddress 下的路徑 http://127.0.0.1:8080/ws_01/HelloWorldService?wsdl 訪問他的 wsdl描述,wsdl描述檔案在應用發布時由容器自動產生,輸出如下
建立用戶端
首先建立一個名為ws_01_client 的 java 項目,然後建立一個Web Service Client,然後在WSDL URL中輸入:http://127.0.0.1:8080/ws_01/HelloWorldService?wsdl,一路下一步即可。
建立好用戶端之後,寫了一個測試類別,代碼如下
package com.foshanshop.ws;import ws.foshanshop.com.HelloWorld;import ws.foshanshop.com.HelloWorldService;public class TestHelloWorld {/** * @param args */public static void main(String[] args) {HelloWorldService helloWorldService = new HelloWorldService();HelloWorld helloWorld = helloWorldService.getHelloWorldPort();System.out.println(helloWorld.sayHello("小星星"));}}
輸出
小星星說:這是一個簡單的Web測試服務!
16:46:26,474 INFO [STDOUT] 用戶端調用了伺服器端的代碼
小結
其實,EJB發布Web Service還是比較簡單的,我這裡只是列出了一個用java語言調用Web Service的方法,其他也都是很類似的。
實際上,WebService的主要目標是跨平台的可互通性。為了達到這一目標,WebService完全基於XML(可延伸標記語言 (XML))、XSD (XMLSchema)等獨立於平台、獨立於軟體供應商的標準,是建立可互操作的、分布式應用程式的新平台。由此可以看出,在以下三種情況下,使用 WebService會帶來極大的好處。
在一個使用者介面和中介層有較多互動的應用程式中,使用 WebService這種結構,可以節省花在使用者介面編程上20%的開發時間。另外,這樣一個由WebService組成的中介層,完全可以在應用程式集 成或其它場合下重用。最後,通過WebService把應用程式的邏輯和資料“暴露”出來,還可以讓其它平台上的客戶重用這些應用程式。
企業級的應用程式開發人員都知道,企業裡經常都要把用不同語言寫成的、在不同平台上啟動並執行各種程式整合起來,而這種整合將花費很大的開發力量。通過WebService,應用程式可以用標準的方法把功能和資料“暴露”出來,供其它應用程式使用。
用WebService來實現B2B整合的最大好處在於可以輕易實現互操作 性。只要把商務邏輯“暴露”出來,成為WebService,就可以讓任何指定的夥伴調用這些商務邏輯,而不管他們的系統在什麼平台上運行,使用什麼 開發語言。這樣就大大減少了花在B2B整合上的時間和成本,讓許多原本無法承受EDI的中小企業也能實現B2B整合。
軟體重用是一個很大的主題,重用的形式很多,重用的程度有大有小。最基本的形式是原始碼模組或者類一級的重用,另一種形式是二進位形式的組件重用。
WebService在允許重用代碼的同時,可以重用代碼背後的資料。使用WebService,再也不必像以前那樣,要先從第三方購買、安裝軟體組 件,再從應用程式中調用這些組件;只需要直接調用遠端的WebService就可以了。
從以上論述可以看出,WebService在通過Web進行互操作或遠程調用的時候是最有用的。不過,也有一些情況,WebService根本不能帶來任何好處。
目前,企業和個人還使用著很多傳統型應用程式。其中一些只需要與本機上的其它程式通訊。在這種情況下,最好就不要用WebService,只要用本地的 API就可以了。COM非常適合於在這種情況下工作,因為它既小又快。運行在同一台伺服器上的伺服器軟體也是這樣。最好直接用COM或其它本地的API來 進行應用程式間的調用。當然WebService也能用在這些場合,但那樣不僅消耗太大,而且不會帶來任何好處。
在許多應用中,所有的程式都是用VB或VC開發的,都在Windows平台下使用COM,都運行在同一個區域網路上。例如,有兩個伺服器應用程式需要相互連信,或者有一個Win32或WinForm的客戶程式要串連區域網路上另一個伺服器的程式。在這些程式裡,使用DCOM會比SOAP/HTTP有效得多。與此相類似,如果一個.NET程式要串連到區域網路上的另一個.NET程式,應該使用.NETremoting。有趣的是,在.NETremoting 中,也可以指定使用SOAP/HTTP來進行WebService調用。不過最好還是直接通過TCP進行RPC調用,那樣會有效得多。