標籤:帶來 std http 最好 map 獨立 com 相同 容器
定義
我們常常會聽到。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註解的類就能夠當做WebServiceserver類。
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("client調用了server端的代碼");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描寫敘述檔案在應用公布時由容器自己主動產生,輸出例如以下
建立client
首先建立一個名為ws_01_client 的 java 項目,然後建立一個Web Service Client,然後在WSDL URL中輸入:http://127.0.0.1:8080/ws_01/HelloWorldService?wsdl。一路下一步就可以。
建立好client之後。寫了一個測試類,代碼例如以下
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] client調用了server端的代碼
小結
事實上,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非常適合於在這樣的情況下工作,由於它既小又快。執行在同一台server上的server軟體也是這樣。
最好直接用COM或其他本地的API來 進行應用程式間的調用。當然WebService也能用在這些場合,但那樣不僅消耗太大,並且不會帶來不論什麼優點。
在很多應用中。全部的程式都是用VB或VC開發的,都在Windows平台下使用COM,都執行在同一個區域網路上。比如,有兩個server應用程式須要相互連信。或者有一個Win32或WinForm的客戶程式要串連區域網路上還有一個server的程式。
在這些程式裡,使用DCOM會比SOAP/HTTP有效得多。
與此相類似,假設一個.NET程式要串連到區域網路上的還有一個.NET程式,應該使用.NETremoting。有趣的是。在.NETremoting 中。也能夠指定使用SOAP/HTTP來進行WebService調用。只是不妨直接通過TCP進行RPC調用,那樣會有效得多。
談談EJB是怎樣公布Web Service的