天天看點

談談EJB是如何釋出Web Service的定義準備步驟輸出小結

定義

我們經常會聽到,xx項目中用到了Web Service。那麼,什麼是Web Service呢?

首先讓我們來了解一下Web Service。Web Service技術,就是能使得運作在不同機器上的不同應用無須借助附加的、專門的第三方軟體或硬體, 就可互相交換資料或內建。依據Web Service規範實施的應用之間,無論它們所使用的語言、平台或内部協定是什麼,都可以互相交換資料。Web Service是自描述、自包含的可用網絡子產品,可以執行具體的業務功能。

Web service是一個平台獨立的,低耦合的,自包含的、基于可程式設計的web的應用程式,可使用開放的XML(标準通用标記語言下的一個子集)标準來描述、釋出、發現、協調和配置這些應用程式,用于開發分布式的互操作的應用程式。

準備

将EJB釋出成Web服務,在EJB容器中不是困難的事情,隻要容器實作了JavaEE的JAX-WS标準就行了,開發人員要做的就是增加一點點有關WebService的注解,打包釋出到應用容器即可。

步驟

建立Web Service

  • 建立一個POJO endpoint

服務端不用再強制規定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 {
	
	@WebMethod
	public String sayHello(String name) {
		System.out.println("用戶端調用了伺服器端的代碼");
		return name + "說:這是一個簡單的Web測試服務!";
	}
}
           

@WebService 這個注釋放置在 Java 類的前面,聲明這個類的部分方法可以被釋出為 Web 服務。 @WebService 的屬性用于設定 Web 服務被釋出時的一些配置資訊,常用的屬性說明如下     1. name Web 服務的名字,WSDL中 wsdl:portType 元素的 name 屬性和它保持一緻,預設是 Java 類或者接口的名字。     2. serviceName Web 服務的服務名,WSDL 中 wsdl:service 元素的 name 屬性和它保持一緻,預設是Java 類的名字+”Service” 。

    3. targetNamespace WSDL檔案所使用的 namespace,該 Web 服務中所産生的其他 XML文檔同樣采用這個作為 namespace 。 @SOAPBinding()表示這個服務可以映射到一個 SOAP 消息中。 Style 用于指定SOAP 消息請求和回應的編碼方式。 @WebMethod 這個注釋放在需要被釋出成 Web 服務的方法前面。

  • 把endpoint定義成Servlet

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>
           
  • 把endpoint打包成war包

定義好Servlet之後,将服務端的類打成war包,部署到JBoss容器中。

注意:POJO endpoint 檔案及 web.xml都是必須的。

經過上面的步驟,完成了一個Web Service 的開發,下面我們通過Jboss管理平台檢視剛才釋出的 Web Service,打開連結 http://localhost:8080/jbossws,看到如下界面

談談EJB是如何釋出Web Service的定義準備步驟輸出小結

點選“ View a list of deployed services ”後,就可以看到已經釋出的Web Services了,如下圖

談談EJB是如何釋出Web Service的定義準備步驟輸出小結

在上圖中你可以點選 ServiceEndpointAddress 下的路徑 http://127.0.0.1:8080/ws_01/HelloWorldService?wsdl 通路 他的 wsdl描述,wsdl描述檔案在應用釋出時由容器自動生成,輸出如下

談談EJB是如何釋出Web Service的定義準備步驟輸出小結

建立用戶端

首先建立一個名為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(可擴充标記語言)、XSD (XMLSchema)等獨立于平台、獨立于軟體供應商的标準,是建立可互操作的、分布式應用程式的新平台。由此可以看出,在以下三種情況下,使用 WebService會帶來極大的好處。

  • 跨防火牆的通信

在一個使用者界面和中間層有較多互動的應用程式中,使用 WebService這種結構,可以節省花在使用者界面程式設計上20%的開發時間。另外,這樣一個由WebService組成的中間層,完全可以在應用程式集 成或其它場合下重用。最後,通過WebService把應用程式的邏輯和資料“暴露”出來,還可以讓其它平台上的客戶重用這些應用程式。

  • 應用程式內建

企業級的應用程式開發者都知道,企業裡經常都要把用不同語言寫成的、在不同平台上運作的各種程式內建起來,而這種內建将花費很大的開發力量。通過WebService,應用程式可以用标準的方法把功能和資料“暴露”出來,供其它應用程式使用。

  • B2B的內建

用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調用,那樣會有效得多。