|
Web服務(wù) Web服務(wù)允許我們建立應(yīng)用組件放置于網(wǎng)絡(luò)上的分布式系統(tǒng). 不管這些應(yīng)用組件是怎么寫的,使用什么語言寫的,要運(yùn)行在什么操作系統(tǒng)上, 我們都能以統(tǒng)一的方式訪問這些組件.如果一個(gè)Web服務(wù)有效并且設(shè)計(jì)實(shí)現(xiàn)了互用性問題,那么無論你的應(yīng)用是用什么語言,在什么平臺(tái)上開發(fā)的,都可以使用這些服務(wù). 為了實(shí)現(xiàn)平臺(tái)無關(guān),實(shí)現(xiàn)獨(dú)立的訪問Web服務(wù), 業(yè)界制定了一系列技術(shù)標(biāo)準(zhǔn),下面是一些最重要的技術(shù): * XML * SOAP * WSDL 下圖展示了上述技術(shù)在工作環(huán)境中是如何使用的. ![]() 在這里,提供者是可以提供服務(wù)的應(yīng)用組件, 申請(qǐng)者是需要使用服務(wù)的客戶端程序. 很多其他技術(shù)也參與了這個(gè)交互過程,但是這里只顯示了在Web服務(wù)環(huán)境中必不可少的核心組件. XFire XFire是一個(gè)免費(fèi)的,開源的SOAP框架. 它不僅允許你輕松簡(jiǎn)易地實(shí)現(xiàn)這么一個(gè)環(huán)境.而且還提供了很多先進(jìn)的特性.不錯(cuò),你沒有看錯(cuò),"輕松簡(jiǎn)易". 本文中你將會(huì)看到用XFire構(gòu)建Web服務(wù)是多么的簡(jiǎn)單.如果你的Web應(yīng)用有一個(gè)Java類, 現(xiàn)在你希望這個(gè)類編程Web服務(wù),用XFire完成這一工作你不必寫一句代碼.僅需操作一下部署描述器,你就會(huì)得到一個(gè)Web服務(wù). 是的, 就是這么簡(jiǎn)單.讓我們來看個(gè)例子. 一個(gè)簡(jiǎn)單的Java類 我的這個(gè)例子是一個(gè)位于Apache Tomcat 5.5.7主機(jī)運(yùn)行在J2SE 1.4.2_07下的銀行應(yīng)用. 我假設(shè)你已經(jīng)知道如何使用Java編寫web應(yīng)用并且已經(jīng)配置了Tomcat服務(wù)器.我們的這個(gè)應(yīng)用很簡(jiǎn)單, 只完成一項(xiàng)工作, 就是將錢從一個(gè)帳戶轉(zhuǎn)到另一個(gè)帳戶.BankingService類中的transferFunds()為我們完成這一工作. 他需要4個(gè)傳入?yún)?shù)
package com.mybank.xfire.example;![]() import java.text.NumberFormat; import java.text.DecimalFormat;![]() ![]() /** *//** XFire WebServices sample implementation class. */![]() public class BankingService implements IBankingService { //Default constructor.![]() public BankingService() { } ![]() /** *//** Transfers fund from one account to another. */ public String transferFunds(![]() String fromAccount, String toAccount, double amount, String currency) { String statusMessage = ""; //Call business objects and other components to get the job done. //Then create a status message and return.![]() try { NumberFormat formatter = new DecimalFormat("###,###,###,###.00"); statusMessage = "COMPLETED: " + currency + " " + formatter.format(amount)+ " was successfully transferred from A/C# " + fromAccount + " to A/C# " + toAccount;![]() } catch (Exception e) { statusMessage = "BankingService.transferFunds(): EXCEPTION: " + e.toString(); } return statusMessage; } }在上面的代碼中你看到奇怪的代碼了嗎? 大概沒有吧. 除了那個(gè)公共的默認(rèn)構(gòu)造函數(shù).這個(gè)構(gòu)造函數(shù)是必不可少的,因?yàn)閄Fire要用他來實(shí)例這個(gè)類. package com.mybank.xfire.example;![]() ![]() public interface IBankingService { ![]() public String transferFunds( String fromAccount, String toAccount, double amount, String currency); }![]() 實(shí)際開發(fā)中,這個(gè)方法可能包含所有復(fù)雜的調(diào)用,請(qǐng)求和處理操作,但是我們的例子將其最小化以便我們能將精力集中到我們的目標(biāo)上:將這個(gè)方法轉(zhuǎn)換成Web服務(wù).
你可以看到,我們的BankingService只不過是一個(gè)普通的Java類,沒有任何代碼說明它是否在Web服務(wù)中使用.這就對(duì)了!我們不需要寫任何代碼,所有工作都交給部署描述去處理. 后面我將介紹如何編寫部署描述。 摘要:XFire本身就是基于Servlet的應(yīng)用,因此我們需要向文件中添加一些必要的參照.那么我們就需要配置我們創(chuàng)建的Web服務(wù).我們使用名叫services.xml的文件來完成配置。
Web應(yīng)用的部署描述 在Java中,Web應(yīng)用至少使用一個(gè)名叫web.xml的部署描述來部署. XFire本身就是基于Severlet的應(yīng)用,因此我們需要向文件中添加一些必要的參照.那么我們就需要配置我們創(chuàng)建的Web服務(wù).我們使用名叫services.xml的文件來完成配置. web.xml 首先想讓我們看一下web.xml.我們需要加上如下語句: <servlet>
<servlet-name>XFireServlet</servlet-name> <display-name>XFire Servlet</display-name> <servlet-class>org.codehaus.xfire.transport.http.XfireConfigurableServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/servlet/XFireServlet/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> services.xml 下面我們就要描述一下我們的Web服務(wù)都包含什么.這個(gè)工作在services.xml中完成.這個(gè)文件位于META-INF/xfire目錄下,下面是基本的配置條目:
第一個(gè)子元素是<name>, 你可以提供任何有效的xml名字,這個(gè)名字會(huì)被客戶端程序和服務(wù)器上的其他組件使用.例如,當(dāng)服務(wù)器起來以后,你可以在瀏覽器上使用這個(gè)名稱來查看WSDL. 下一個(gè)子元素是<namespace>. 任何有效地xml名稱都可以, <namespace>將作為你服務(wù)器的唯一標(biāo)識(shí)變量使用. <serviceClass>元素包含Java類名用來指明方法的簽名.在我們的這個(gè)例子中是IBankingService接口.如果你的Java類沒有實(shí)現(xiàn)任何接口,那就填入類名.在你的Java類或接口中也許含有不知一個(gè)方法,只需要一個(gè)入口來將他們轉(zhuǎn)換成Web服務(wù). <implementationClass>元素記錄實(shí)現(xiàn)接口的Java類名.這是一個(gè)可選元素.如果前一個(gè)元素<serviceClass>填入的是接口,那么此處就要填入相應(yīng)的實(shí)現(xiàn)類名. |
|
|