xfire--開發WEB SERVICE的又一利器

1 Web Service 簡介

1.1 什麼是Web Service

從表面上看,Web service 就是一個應用程序,它向外界暴露出一個能夠通過Web進行調用的API。這就是說,你能夠用編程的方法通過Web來調用這個應用程序。我們把調用這個Web service 的應用程序叫做客戶。

另一種更精確的解釋:Web services是建立可互操作的分佈式應用程序的新平臺。Web service平臺是一套標準,它定義了應用程序如何在Web上實現互操作性。你可以用任何你喜歡的語言,在任何你喜歡的平臺上寫Web service,只要我們可以通過Web service標準對這些服務進行查詢和訪問。Web service平臺需要一套協議來實現分佈式應用程序的創建。任何平臺都有它的數據表示方法和類型系統。要實現互操作性,Web service平臺必須提供一套標準的類型系統,用於溝通不同平臺、編程語言和組件模型中的不同類型系統。在傳統的分佈式系統中,基於界面(interface)的平臺提供了一些方法來描述界面、方法和參數(譯註:如COMCOBAR中的IDL語言)。同樣的,Web service平臺也必須提供一種標準來描述Web service,讓客戶可以得到足夠的信息來調用這個Web service。最後,我們還必須有一種方法來對這個Web service進行遠程調用。這種方法實際是一種遠程過程調用協議(RPC)。爲了達到互操作性,這種RPC協議還必須與平臺和編程語言無關。

1.2 Web Service用到的技術

爲了實現平臺無關,實現獨立的訪問Web服務, 業界制定了一系列技術標準,下面是一些重要的技術:

1.        XML
可擴展的標記語言(XML)Web service平臺中表示數據的基本格式。它的內容與表示的分離十分理想,除了易於建立和易於分析外,XML主要的優點在於它既是平臺無關的,又是廠商無關的。無關性是比技術優越性更重要的:軟件廠商是不會選擇一個由競爭對手所發明的技術的。

2.        SOAP
Web service
建好以後,你或者其他人就會去調用它,簡單對象訪問協議(SOAP)提供了標準的RPC方法來調用Web serviceSOAP規範定義了SOAP消息的格式,以及怎樣通過HTTP協議來使用SOAPSOAP也是基於XMLXMLSOAP的數據編碼方式。

3.         WSDL
你會怎樣向別人介紹你的Web service有什麼功能,以及每個函數調用時的參數呢?你可能會自己寫一套文檔,你甚至可能會口頭上告訴需要使用你的Web service的人。這些非正式的方法至少都有一個嚴重的問題:當程序員坐到電腦前,想要使用你的Web service的時候,他們的工具(Visual Studio)無法給他們提供任何幫助,因爲這些工具根本就不瞭解你的Web service。解決方法是:用機器能閱讀的方式提供一個正式的描述文檔。Web service描述語言(WSDL)就是這樣一個基於XML的語言,用於描述Web service及其函數、參數和返回值。因爲是基於XML的,所以WSDL既是機器可閱讀的,又是人可閱讀的,這將是一個很大的好處。一些最新的開發工具既能根據你的Web service生成WSDL文檔,又能導入WSDL文檔,生成調用相應Web service的代碼。

 

2 XFire進行Web Service開發

2.1 XFire簡介

      

在架構上可以把XFire大概分爲 Service, Transport Invoker 三個層面。
Service
層是 XFire 架構的靜態基礎,負責完成對服務的註冊及其管理。核心的 ServiceRegistry 接口完成對服務自身的生命期管理,如註冊/註銷/獲取等等;而 ServiceFactory 接口則負責從具體的 POJO 類型,生成實現 Service接口的可被管理的服務代理。
Transport
層則是 XFire 的外部 IO 處理系統。由 TransportManager 接口對具體的 Transport 接口實現進行管理,默認提供了基於 pipe LocalTransport 和基於 Http 協議的 SoapHttpTransport。理論上可以任意進行擴展,例如 XFire 發佈包中還提供了基於 JMS XMPP 的實現。
Invoker
則是 XFire 的動態調用層,負責在 Transport 層接受到請求後,解析內容、調用合適服務並最終返回 SOAP 封包給調用者。運行時 Invoker 負責維繫 Service Transport 之間的聯繫。

因此一個服務的生成和註冊往往類似如下代碼:

[code]Service endpoint = serviceFactory.create(clazz)// 根據具體類型創建服務

XFire.getServiceRegistry().register(endpoint)// 向服務管理註冊服務
endpoint.setInvoker(new BeanInvoker(bean))
// 設定服務調用模式
[/code]

最基本的XFire 接口,實際上就是 getServiceRegistry()getTransportManager() 的封裝。

XFire 中另一塊核心的思想,就是其靈活而強大的 binding 機制,負責完成 Java 類型與 SOAP 消息的雙向轉換。XFire僅僅內建就支持 POJO(Aegis), Castor,JAXB 1.1, JAXB 2.0 XMLBeans 多種模式,你可以根據需求選擇從全自動POJO生成,到全手工 xsd 文件定義的不同方式。

 

2.2 配置XFire

XFire的官方下載地址: http://XFire.codehaus.org/

從官方網站下載到本地機器後解壓,目錄結構如下:

 

XFire-distribution-1.1-beta-1

|____api (javadoc文檔)

|____examples (XFire例子)

|____lib (XFire所需的jars)

|____modules (XFire模塊)

|____XFire-all-1.1-beta-1.jar

|____幾個授權和說明TXT文檔

 

XFire的配置我們以一個簡單的Web服務的例子來進行說明,並且在這裏你將瞭解到如何將一個java文件轉換成web服務?services.xml文件是如何定義的?如何發佈這個web服務?如何獲得這個服務的WSDL

 

首先打開Eclipse,創建一個工程。目錄結構如下圖:

創建一個簡單的java文件,這個java文件只提供一個MathService方法(文件所在位置:Src/com/mybank/XFire/example/MathService.java)。

WebRoot/WEB-INF/classes目錄下創建META-INF/XFire目錄,然後在META-INF/XFire目錄下創建services.xml文件,文件內容爲:

這個文檔定義了你要發佈的Web服務,定義了一個名爲MathService的服務,服務類爲

com.mybank.XFire.example.MathService。具體解釋如下:

Web服務的定義包含在<service>元素內,<service>元素下還有若干子元素。
第一個子元素是<name>,你可以提供任何有效的xml名字,這個名字會被客戶端程序和服務器上的其他組件使用。例如,當服務器起來以後,你可以在瀏覽器上使用這個名稱來查看WSDL

下一個子元素是<namespace>,任何有效地xml名稱都可以,<namespace>將作爲你服務器的唯一標識變量使用。
<serviceClass>
元素包含Java類名用來指明方法的簽名。

<implementationClass>元素記錄實現接口的Java類名。這是一個可選元素,如果前一個元素<serviceClass>填入的是接口,那麼此處就要填入相應的實現類名。

注:你可以在services.xml文件中定義多個Web服務。

Web應用的部署描述:

將需要的庫文件copy到工程的lib目錄下,所需的庫文件如下:(這些jar文件可以從distribution和它的lib目錄下得到)

  • activation-1.0.2.jar

  • commons-codec-1.3.jar

  • commons-httpclient-3.0.jar

  • commons-logging-1.0.4.jar

  • jaxen-1.1-beta-8.jar

  • jdom-1.0.jar

  • log4j-1.2.x.jar

  • mail-1.3.3_01.jar

  • spring-1.2.x.jar

  • stax-api-1.0.jar

  • wsdl4j-1.5.2.jar

  • wstx-asl-2.9.jar

  • xbean-2.1.0.jar

  • xbean-spring-2.2.jar

  • XFire-all-1.0.jar

  • XmlSchema-1.0.jar

 

這樣我們一個簡單的web服務就開發完了,下面就要將它發佈出去。

利用Eclipse進行部署(具體怎樣部署略),啓動tomcat,你就可以檢查這個web服務是否發佈成功。

打開瀏覽器,在瀏覽器地址欄中輸入http://localhost:8080/XFireProject/services/MathService?wsdl

可以查看這個web服務的wsdl文檔。

 

如果在你的機器上顯示如上圖所示,那麼說明你的這個web服務發佈成功,可以正常提供基於httpweb服務。

2.3 使用XFire開發Web服務的基本步驟


1
、檢驗Java類的方法和構造函數是公共的(public)。

2、將XFire Servlet相關的入口添加到web.xml中。

3、創建services.xml並把它放到WEB-INF/classes/META-INF/XFire目錄下。

4、將XFire和其他第三方庫添加到你的Web應用的WEB-INF/lib 目錄下。

2.4 集成Spring   

XFire可以很好的集成到Spring中去,Spring已經做了這方面的集成!

首先,我們先來創建我們的工程,目錄結構如圖:

然後,創建web服務,採用接口和實現類的方式。

接口EchoHello.java

實現類EchoHelloImpl.java

作爲web服務的java文件我們已經建好了,下面要做的事情就是配置了。

WEB-INF文件夾下創建applicationContext.xml文件,這是Spring的配置文件,如果你使用其它的Spring配置文件,可以將下面的bean添加到那個配置文件中去。

這裏定義了echoBean,這個Bean就是我們的實現類,當然你也可以在這裏定義其它需要Spring管理的Bean

META-INF/XFire/services.xml文件可以省略了,因爲web服務的定義在XFire-servlet.xml中可以找到。

WEB-INF文件夾下創建XFire-servlet.xml文件,根據Spring規範這個文件名起做XFire-servlet.xml,其中XFireweb.xml配置的DispatcherServlet名稱:

 

 

這個文件的上半部分將EchoHelloService這個URLmath這個bean聯繫在一起。下半部分定義了Web服務的bean和服務接口。其中echoBean是我們在applicationContext.xml中配置的那個bean

 

最後一步就是修改web.xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

   

    <context-param>

       <param-name>contextConfigLocation</param-name>

       <param-value>

           /WEB-INF/applicationContext.xml

           classpath:org/codehaus/xfire/spring/xfire.xml

       </param-value>

    </context-param>

   

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>  

      

    <servlet>

       <servlet-name>xfire</servlet-name>

       <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

    </servlet>

   

    <servlet-mapping>

       <servlet-name>xfire</servlet-name>

       <url-pattern>/*</url-pattern>     

    </servlet-mapping>

 

</web-app>

 

org/codehaus/XFire/spring/XFire.xml

文件爲TransportManager, ServiceRegistry 和一些簡單的 ServiceFactorys包含了一些標準的bean定義。

部署略。

這樣,你就可以訪問http://localhost:8080/XFireSpring/EchoHelloService來調用我們的web服務,也可以通過網址http://localhost:8080/XFireSpring/EchoHelloService?wsdl來查wsdl文檔。

至此我們web服務的開發、發佈已經完成。

2.5 開發一個客戶端來調用我們的web服務

說明:

這裏所講的客戶端開發是手動的、很普遍的一種開發方式,由於其他一些因素的限制,象“利用WSDL產生客戶端”等一些開發客戶端的方法以後再逐漸深入研究。

首先,我們封裝一下XFire service--proxy api,程序如下:

    分析一下程序:首先我們創建了一個服務模型,裏面包含了對服務的描述,換句話說,我們創建了服務的元數據。我們是用XFireObjectServiceFactory通過接口clazz創建了這個服務模型。
下一步就是獲取XFire的代理對象,這一步中沒有任何應用細節。通過proxyFactory,使用服務模型和服務終點URL(用於獲得WSDL),我們獲得了服務的本地代理。這個代理就是實際的客戶端。

現在,可以調用我們的web服務了。

web服務部署成功並啓動的話,我們運行我們的客戶端程序,將顯示:

2.6 內含的XFire HTTP Service

n        開發步驟:

l        創建服務

l        XFire's的內含的服務器來部署服務

l        爲服務創建一個客戶端

n        開發實例:

l        工程結構如下:

l        創建服務:

首要的任務是創建我們的服務,它是一個接口(interface),Java代理服務器(Proxies)需要這個接口。

也需要它的一個實現。

l        XFire's的內含的服務器來部署服務

下面我們將要寫一個叫做ServiceStarter的類,這個類從ServiceFactory創建一個服務,並且啓動一個XFireHttpServer實例。

XFireServiceFactorys負責創建和配置服務

l        爲服務創建一個客戶端

此處客戶端的開發和集成Spring客戶端的開發大致都是一樣的,只需將

SERVICES_URL = http://localhost:8080/XFireSpring/EchoHelloService替換成

SERVICES_URL = http://localhost:8191/EchoHello8191是端口號,可指定任意有效的端口號,這裏爲了和tomcat8080端口進行區分)

啓動服務端的服務(運行ServiceStarter中的start方法即可),就可以通過http://localhost:8191/EchoHello來調用我們的服務了。

2.7 關於WebService安全性的考慮

目前考慮實現的方式:

1.      基於Web容器的角色認證(正在研究中)。

2.      在應用程序中進行控制(目前可以實現)。

3.      WS-Security(需要JDK1.5等)。

4.      SOAP authentication with handlers(目前可以實現)

 

下面主要介紹下SOAP authentication with handlers一種是集成Spring的驗證,另一種不是和Spring集成的,也就是一個普通的java Web服務。Web服務的開發這裏不再詳細介紹,仿照前面的例子即可,主要介紹一下和安全驗證方面有關的。

u      集成SpringWeb服務安全驗證

l        服務端(web服務的提供者)

1.        定義服務端的Handler,用來讀取客戶端傳過來的Soap header

             

2.        applicationContent.xml如下:

3.        xfire-services.xml如下:

4.        web.xml不用做修改

 

l        客戶端(web服務的調用者)

1.        定義輸出 Handler用於客戶端創建Soap Header

2.        在客戶端往輸出Handler中加入驗證Handler

u      普通的java服務

u      服務端(web服務的提供者)

1.        定義服務端的Handler,用來讀取客戶端傳過來的Soap header

2.        webservices.xml如下:

3.        web.xml如下:

l        客戶端(web服務的調用者)

與集成Spring的客戶端是一樣,這裏略!!!

 

 

 

 

 

2.8 補充說明

u      services.xml的補充說明:

1.        如果配置web服務的文件名字是默認的(即services.xml),那麼web.xml文件不需要爲Xfire配置相關信息去查找services.xml文件。web.xml文件如下:

services.xml文件放在這個路徑下:

WEB-INF/META-INF/xfire/services.xml

2.        如果配置web服務的文件名字不是默認的(即xxxx.xml),那麼web.xml文件就需要爲Xfire配置相關信息去查找services.xml文件。web.xml文件如下:

webservices.xml文件放在這個路徑下:

WEB-INF/xfire/ webservices.xml(必須放在WEB-INF目錄下)。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章