![]() | ![]() |
![]() |
級別: 初級 肖 菁, 自由撰稿人 2007 年 5 月 16 日 Java 社區一直試圖將 POJO 的作用發(fā)揮到極致,降低 Java 應用實(shí)現的難度,最近的嘗試是將 EJB3.0 建立在 POJO 之上;另一方面,SOA 是目前 Java 社區炙手可熱的名詞,非常多的企業(yè)都在努力應用和實(shí)施 SOA;XFire 為這兩方面的需求提供了一種魔術(shù)般的解決方式,我們很快能夠發(fā)現使用 XFire 創(chuàng )建和發(fā)布 Web 服務(wù)可以直接基于 POJO,將煩人的繼承關(guān)系和一大堆其他可能的約束丟在一邊。 POJO(Plain Old Java Object,簡(jiǎn)單 Java 對象)是 Java 社區中最早的成員(回想您學(xué)習 Java 時(shí)第一個(gè)興奮的時(shí)刻,那個(gè)簡(jiǎn)單的 "Hello World!" 例子),也是最簡(jiǎn)單、最容易實(shí)現的方式。 然而現實(shí)中 Java 的發(fā)展已經(jīng)遠遠超越了 POJO 的范圍,成為面向對象技術(shù)應用中最成功的編程語(yǔ)言,尤其是繼承、多態(tài)的應用為我們造就了一大批開(kāi)發(fā)框架(如 Struts)和標準(如 EJB),隨之而來(lái)的就是實(shí)現的復雜化,我們必須面對一大堆繼承關(guān)系的限制。比如說(shuō):要開(kāi)發(fā)一個(gè)基于 Struts 的應用,我們必須了解 Struts 特定的繼承關(guān)系如 ActionForm、ValidateActionForm;要開(kāi)發(fā)一個(gè) EJB 應用,我們必須繼承 EJBObject、SessionEJB 等。 為了拋開(kāi)這些限制,降低 Java 應用實(shí)現的難度,Java 社區開(kāi)始重新審視 POJO 的價(jià)值,試圖將 POJO 的作用發(fā)揮到極致,最新的努力是 EJB3.0。Java 社區將 EJB3.0 設計為基于 POJO,而不是為他準備更多的繼承關(guān)系等限制。 SOA 已經(jīng)成為了目前 Java 社區中炙手可熱的名詞,幾乎所有的軟件廠(chǎng)商都在討論它,為他提供解決方案和產(chǎn)品支持,大部分的企業(yè)也已經(jīng)在企業(yè)內部實(shí)施或者正在考慮實(shí)施 SOA。 然而 SOA 在企業(yè)內的實(shí)施卻不是一項簡(jiǎn)單的任務(wù),即使拋開(kāi)新建系統直接基于 SOA 架構實(shí)施的因素,要把企業(yè)已有系統納入 SOA 框架也不是一件容易的事情。企業(yè)必須在對當前架構深入了解的基礎上,對已有系統進(jìn)行大規模的改造才能滿(mǎn)足新的要求。如何經(jīng)濟的從原有技術(shù)架構切換到 SOA 架構成為很多企業(yè)的難題。
XFire 是 codeHaus 組織提供的一個(gè)開(kāi)源框架,它構建了 POJO 和 SOA 之間的橋梁,主要特性就是支持將 POJO 通過(guò)非常簡(jiǎn)單的方式發(fā)布成 Web 服務(wù),這種處理方式不僅充分發(fā)揮了 POJO 的作用,簡(jiǎn)化了 Java 應用轉化為 Web 服務(wù)的步驟和過(guò)程,也直接降低了 SOA 的實(shí)現難度,為企業(yè)轉向 SOA 架構提供了一種簡(jiǎn)單可行的方式。 XFire 目前最新的版本是 1.2.2,目前支持的特性主要包括:
XFire 框架目前的最新版本是 1.2.6,可以訪(fǎng)問(wèn) xfire.codehaus.org 下載 XFire 框架的安裝包,下載時(shí)請選擇“全部二進(jìn)制發(fā)布包(Binary Distribution in zip package)”,而不僅僅是“XFire jar 文件(Jar of all XFire modules)”。 下載完成后,我們可以將下載的 .zip 文件解壓縮到任意的文件夾中(后面的章節中使用 % XFIRE_HOME % 表示 XFire 框架的安裝目錄),解壓縮后形成的文件目錄結構如下:
XFire框架是一種基于Servlet技術(shù)的SOA應用開(kāi)發(fā)框架,要正常運行基于XFire應用框架開(kāi)發(fā)的企業(yè)應用,除了XFire框架本身之外,還需要JDK和Servlet容器的支持。 XFire 支持非常多的特性,其中不同的特性對 JDK 版本的要求有所不同,比如如果項目中選擇基于 JSR181 標準發(fā)布 Web 服務(wù),我們就需要選擇 JDK5 或者以上版本,如果僅僅選擇將 Web 服務(wù)綁定到最簡(jiǎn)單的 POJO,我們只需要選擇 JDK1.4 版本即可。 JDK 各版本均可以在 java.sun.com 網(wǎng)站上下載,如何安裝 JDK 請參考 SUN 公司的相關(guān)技術(shù)文檔和 JDK 的幫助文檔。 XFire 是一種基于 Servlet 技術(shù)的 SOA 應用開(kāi)發(fā)框架,需要 Servlet 容器的支持。XFire 支持在多種 Servlet 容器中運行,包括 Websphere、Weblogic、TOMCAT 等。為了說(shuō)明的簡(jiǎn)單,我們選擇使用 TOMCAT(版本5.0.30)作為 XFire 的運行容器,所有配置過(guò)程和發(fā)布步驟的說(shuō)明也均是針對 TOMCAT,如果讀者使用 TOMCAT 之外的其它 Servlet 容器或者選擇了 TOMCAT 的其它版本,下面的配置過(guò)程和步驟可能需要做出調整,請讀者根據實(shí)際 Servlet 容器的幫助文檔進(jìn)行相應調整。 TOMCAT 各版本均可以在 tomcat.apache.org 網(wǎng)站上下載,如何正確安裝 TOMCAT 服務(wù)器請參考 TOMCAT 服務(wù)器的幫助文檔。 XFire 需要 xalan 項目的支持,然而 1.2.6 版本中并沒(méi)有帶有相應的 jar 文件,因此請訪(fǎng)問(wèn) xml.apache.org,下載 xalan 項目的二進(jìn)制包。
前面的章節中我們下載和安裝了 XFire 安裝包和所需要的支持環(huán)境,現在我們開(kāi)始學(xué)習如何從零開(kāi)始創(chuàng )建 XFire 應用開(kāi)發(fā)環(huán)境。下面的所有配置過(guò)程和發(fā)布步驟均針對 TOMCAT(版本5.0.30)服務(wù)器,如果選擇其它的 Servlet 容器,下面的配置過(guò)程和步驟可能需要做出調整,請讀者根據實(shí)際 Servlet 容器的幫助文檔進(jìn)行相應調整。
清單 1-1 WEB-INF\web.xml
拷貝 %XFIRE_HOME%/lib 目錄下所有文件到 “1、創(chuàng )建 Web 應用目錄和基本元素” 中所創(chuàng )建的 ”lib”目錄下,將 %XFIRE_HOME%/XFire-all-1.2.6.jar 文件也拷貝到 “1、創(chuàng )建 Web 應用目錄和基本元素” 中所創(chuàng )建的 ”lib”目錄下。將 xalan 安裝包中的所有 jar 文件和所需要的支持 jar 文件拷貝到相同的 ”lib”目錄下。 [注] 為了減少拷貝的 jar 文件的數目,開(kāi)發(fā)者可以根據項目的需要選擇需要拷貝的 jar 文件,而不是全部拷貝,如何根據需要選擇拷貝合適的類(lèi)包文件請訪(fǎng)問(wèn) XFire 站點(diǎn)。 修改 web.xml 文件,在其中增加如下 Servlet 定義內容。
4、創(chuàng )建 XFire 框架的服務(wù)發(fā)布文件 services.xml
清單 1-2 WEB-INF\classes\META-INF\xfire\services.xml
XFire 框架中,我們有兩種方式將 POJO 發(fā)布成 Web 服務(wù):
下面的章節中我們將學(xué)習使用第一種方式來(lái)完成 POJO 的 Web 服務(wù)發(fā)布。我們將使用經(jīng)典的 ”Hello World!”例子來(lái)演示將 POJO 發(fā)布成 Web 服務(wù)所需要的步驟,不過(guò)我們不再是簡(jiǎn)單的訪(fǎng)問(wèn)一個(gè) Java 方法來(lái)輸出 ”Hello World!”字符串,而是轉為在 SOA 環(huán)境下實(shí)現:Web 服務(wù)客戶(hù)端通過(guò)訪(fǎng)問(wèn)服務(wù)器端發(fā)布成 Web 服務(wù)的 POJO 獲得返回的 ”Hello World!”字符串后輸出到客戶(hù)端的控制臺上。 將 POJO 發(fā)布成 Web 服務(wù)的基本步驟如下:
下面我們通過(guò)創(chuàng )建 ”Hello World!”例子來(lái)具體說(shuō)明如何實(shí)現這三個(gè)步驟。 1.創(chuàng )建 Web 服務(wù)接口 ---- HelloWorldService 要將 POJO 發(fā)布成 Web 服務(wù),首先需要創(chuàng )建 Web 服務(wù)接口,在接口中聲明該 Web 服務(wù)需要對外暴露的接口。 我們根據需要創(chuàng )建 Web 服務(wù)接口 ” HelloWorldService”,在其中聲明一個(gè) ”sayHello”方法,該方法返回 ”String ”類(lèi)型的內容?!?HelloWorldService”接口對應的 Java 文件代碼如 清單 1-3。 清單 1-3 WEB-INF\classes\org\vivianj\xfire\pojo\HelloWorldService.java
2.創(chuàng )建 Web 服務(wù)實(shí)現類(lèi) ”HelloWorldServiceImpl” 創(chuàng )建 Web 服務(wù)實(shí)現類(lèi) ”HelloWorldServiceImpl”,它繼承 ”1、創(chuàng )建Web服務(wù)接口 ---- HelloWorldService” 中創(chuàng )建的 HelloWorldService 接口,并且為它聲明的 ”sayHello”方法提供具體實(shí)現: 返回字符串”Hello World!”。 ”HelloWorldServiceImpl”類(lèi)對應的 Java 文件代碼如 清單 1-4。 清單 1-4 WEB-INF\classes\org\vivianj\xfire\pojo\HelloWorldServiceImpl.java
3.修改 services.xml,將 POJO 發(fā)布成 Web 服務(wù) 我們可以在 WEB-INF\classes\META-INF\XFire\services.xml 文件中的 <beans …> 和 </beans> 元素中間加入如下的 xml 內容將上面創(chuàng )建的 HelloWorldService 發(fā)布成 Web 服務(wù)。
其中各元素的功能如下:
更多 service 元素的子元素和它們的用法請參考 XFire 站點(diǎn)。 通過(guò)上面的三個(gè)步驟,我們已經(jīng)將新創(chuàng )建的HelloWorldService發(fā)布成了Web服務(wù),我們可以使用下面的步驟測試一下創(chuàng )建的Web服務(wù)是否能夠正常運行:
其中 HelloWorldServcie 是配置文件中 service\name 元素所定義的內容,”wsdl”參數表示查看該 Web 服務(wù)的 WSDL(Web服務(wù)描述語(yǔ)言)文件。 如果瀏覽器中出現如下圖所示類(lèi)似的內容,表示 Web 服務(wù)發(fā)布成功,我們可以編寫(xiě)客戶(hù)端訪(fǎng)問(wèn)該 Web 服務(wù)從服務(wù)器獲取返回字符串,本文下載資源中提供的下載文件中包含有可供參考的客戶(hù)端類(lèi) org.vivianj.xfire.pojo.client.HelloWorldServiceClient。 圖:瀏覽器中訪(fǎng)問(wèn)效果 ![]() 如果瀏覽器中出現錯誤提示,請按照上面的步驟和說(shuō)明檢查已經(jīng)完成的開(kāi)發(fā)、配置過(guò)程是否完全正確。
本文中作者首先講解了 XFire 框架的主要特性,XFire 框架的運行環(huán)境以及基于 XFire 框架開(kāi)發(fā) SOA 應用的基本步驟,并且借助于 SOA 環(huán)境下的 ”Hello World!”例子,詳細的講解和演示了如何基于 XFire 框架、經(jīng)過(guò)簡(jiǎn)單的開(kāi)發(fā)、配置步驟就將一個(gè) POJO 類(lèi)中包含的方法發(fā)布成Web服務(wù)。從 ”Hello World!”例子實(shí)現的過(guò)程中,我們可以發(fā)現 XFire 框架最大化的發(fā)揮了 POJO 的作用,減少了 SOA 實(shí)施時(shí)對框架本身的依賴(lài),降低了 SOA 實(shí)施的難度,企業(yè)實(shí)施 SOA 時(shí)并不需要增加太多的投入就可以實(shí)現目標。
|
聯(lián)系客服