用J2EE開發WebService

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- 用J2EE開發WebService (http://www.webasp.net/article/9/8071.htm)
-- 作者:未知
-- 發佈日期: 2004-02-13
I. 概要

基於XML的Web服務是參照B2B通信協作模式制定的新的規範。它提供了概念上和結構上的,適用於各種不同平台和產品的基礎。現在,開發者可以利用J2EE技術來開發基於XML的Web服務。他們可以利用現存的J2EE技術來開發完整的,遵從XML標準的,能完全共通的WEB服務。無需重新設計或者構造現有的J2EE系統,開發人員就可以構建複雜的強大的Web服務應用。

II. 介紹 Web服務是一種可以接收從Internet或者Intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術。這種技術允許網絡上的所有系統進行交互。隨著技術的發展,一個Web服務可以包含額外的指定功能並且可以在多個B2B應用中協作通訊。

Web服務正在不斷完善,並且以一種非常智能的動態的方法來進行。這些靈活的Web服務可以理解請求中上下文的關係,並且在每一個特定的情況下產生動態的結果。這些服務會根據用戶的身份,地點以及產生請求的原因來改變不同的處理,用以產生一個唯一的,定制的方案。這種協作機制對那些只對最終結果有興趣的用戶來說,是完全透明的。

這種Web服務所遵循的XML標準可以增進事物通信的性能。開發人員將可以利用不同的平台,產品和標準來實現很多種可能。通過這種標準,開發人員可以建立一個系統使他們的Web服務提供最大的協同工作的能力。

這份白皮書描述了如何方便地利用Java和XML技術來實現Web服務構架。它說明了Web服務中的每一個關鍵部分以及如何使他們結合在一起。你將會對基於XML的Web服務的結構以及如何與J2EE結合,有一個更加深入的瞭解我們從如何利用J2EE建立Web服務開始。這部分將使你對如何建立一個Web服務有一個瞭解。

III. 總結 一般來說,在不同的事務之間進行電子通信協作會有很多阻礙。全異的系統,安全限制和不相同的數據格式,導致很多B2B系統在他們自己的領域或者客戶群中形成唯一。Web服務將改變這一切,使不同的事務互相通信變為可能,值得注意的是,這會降低建立商業站點的開發和維護成本。

在建立Web服務的時候,有三個主要步驟:

1. 建立客戶端聯接 為了允許Applets,Applications,商業合作夥伴,瀏覽器和PDAs 使用Web服務。

2. 實現Web服務 包括工作流,數據傳送,商業邏輯以及數據訪問。這些功能是隱藏在Web服務後,並且為客戶端工作的。

3. 聯接後台系統 這個系統可能包括一個或多個數據庫,現存的企業信息系統,商業合作夥伴自己的系統或者Web服務,以及在多個系統中共享的數據。

你可以利用J2EE來實現這三個目標。用J2EE開發Web服務基於以下兩個技術:

XML 技術.
在Web服務中,XML標準是非常重要的。XML是一種數據格式,它可以以一種連貫的方式來表現數據,並且可以在網絡中以點對點的形式傳送。這些不同的XML標準連同指定的處理方法是設計來支持特定的行為的。

Java 技術.
Developers開發人員利用 J2EE APIs來創建事務和表現的邏輯,訪問XML文檔,以及對XML文檔進行操作。信任被證實可行的Java技術是非常重要的,因為它允許開發者利用現有的下部構造,在其上構建新的功能。開發者可以繼續利用J2EE的標準API以及各種優秀的組件來開發系統。現在,開發者可以利用J2EE中提供的Java API for XML Parsing (JAXP) 來開發Web服務,我們將在稍後介紹。這個新的APIs主要用來處理XML數據格式以及服務,將使開發變得更容易,效率更高。
圖 1 表現了基於J2EE的Web服務的核心構架。請注意,很多APIs在這裡並沒有全部表示出來,像用來解析或者傳送消息的。但是,那些基於J2EE的標準,協議以及主要的子系統都表示出來了。

圖 1讓我們進一步看一下利用J2EE來創建Web服務的細節。

IV. 客戶端聯接

客戶端聯接是關於Web服務的使用者如何來使用你的系統。表格 1 顯示了三種主要使用系統的客戶。

客戶類型 |樣例 |如何聯接
============================================================================
商業合作夥伴 |代理商,客戶群 |基於XML的Web 服務技術 (SOAP, UDDI, WSDL, ebXML)
瘦客戶端 |瀏覽器,PDAs,無線設備 |HTTP 協議
胖客戶端 |應用小程序,應用程序,已經存在的系統 |IIOP協議
============================================================================
表格 1商業合作夥伴的聯接

第一種訪問Web服務的客戶類型是商業合作夥伴。他們可能使用很多種類型的編程語言,中間件或者硬件。當他們訪問尼的系統的時候,Web服務要求返回一個XML文件。這個文件具有標準的標記來表示商業數據,並且允許不同的系統通過這個來交互。

Java Servlets

當一個商業合作夥伴向Web服務發佈一個請求的時候,接收請求的是一個Java servlet. 這個Servlet是一個在管理容器中運行,負責接收請求和響應的Java對象。它可以以很多種協議返回請求結果,像HTTP, FTP或者POP。在這個例子中Servlet通常使用HTTP來響應請求,這樣的話,Web服務就可以利用HTTP來通過防火牆了。

當一個請求到達J2EE Web服務的時候,以下操作會發生,見圖2

1. Java servlet接收XML 文檔。

2. Servlet 處理傳入的基於XML的請求

3. Servlet調用一個或者多個Enterprise JavaBeans (EJB) 組件來處理數據。

4. EJB組件進行他們自己的處理,可能會調用其他存在的系統。

5. EJB 組件把結果返回給Servlet。

6. Servlet 把結果彙集到XML文檔中。

7. Servlet 把XML傳送到客戶端。

圖 2為了實現商業合作夥伴的聯接,必須有一種方法來發佈,描述,定位以及調用一個Web服務。我們現在來描述如何達到這個目的。

UDDI 在用戶能夠調用Web服務之前,必須確定這個服務內包含哪些商務方法,找到被調用的接口定義,還要在服務端來編製軟件。所以,我們需要一種方法來發佈我們的Web服務。

UDDI (Universal Description, Discovery, and Integration) 是一個主要針對Web服務供應商和使用者的新項目。UDDI 項目中的成員可以通過UDDI Business Registry (UBR) 來操作Web服務的調用,UBR是一個全球性的服務。Web服務供應商可以在UBR中描述並且註冊他們的服務。用戶可以在UBR中查找並定位那些他們需要的服務。

UDDI是一種根據描述文檔來引導系統查找相應服務的機制。UDDI包含標準的"白皮書"類型的商業查詢方式,"黃皮書"類型的局部查找,以及"綠皮書"類型的服務類型查找。"綠皮書"允許開發者精確查找符合服務類型的所有服務。(這一段翻的比較奇怪)

UDDI利用SOAP消息機制(標準的XML/HTTP)來發佈,編輯,瀏覽以及查找註冊信息。它採用XML格式來封裝各種不同類型的數據,並且發送到註冊中心或者由註冊中心來返回需要的數據。

JAXR

為了支持UDDI在Java平台上的功能,Java APIs for XML Registries (JAXR)允許開發者來訪問註冊中心。值得注意的是,JAXR並不是建立Web服務必需的,你可以利用其他常用的XML APIs來直接集成這些協議。JAXR是一個方便的API,它提供了Java API來發佈,查找以及編輯那些註冊信息。它的重點在於基於XML的B2B應用,複雜的地址本查找以及對XML消息訂閱的支持等Web服務。它也可以用來訪問其他類型的註冊中心,像ebXML註冊中心(稍候描述)。

這些對Web服務的註冊信息進行的操作,可以使用當前的一些Web服務工具來完成(例如第三方的SOAP和ebXML消息工具)。另外,當JAXP提供了一致並具有針對性的API來完成這些操作,這將使開發變得更加容易。

WSDL

對於商業用戶來說,要找到一個自己需要使用的服務,他必須知道如何來調用。WSDL (Web Services Description Language) 規範是一個描述接口,語義以及Web服務為了響應請求需要經常處理的工作的XML文檔。這將使簡單地服務方便,快速地被描述和記錄。

以下是一個WSDL的樣例:




<?xml version="1.0"?>
<definitions name="StockQuote"
targetNamespace="http://example.com/stockquote.wsdl"
xmlns:tns="http://example.com/stockquote.wsdl"
xmlns:xsd1="http://example.com/stockquote.xsd"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<schema targetNamespace=http://example.com/stockquote.xsd
xmlns="http://www.w3.org/2000/10/XMLSchema">
<element name="TradePriceRequest">
<complexType>
<all>
<element name="tickerSymbol" type="string"/>
</all>
</complexType>
</element>
<element name="TradePrice">
<complexType>
<all>
<element name="price" type="float"/>
</all>
</complexType>
</element>
</schema>
</types>
<message name="GetLastTradePriceInput">
<part name="body" element="xsd1:TradePriceRequest"/>
</message>
<message name="GetLastTradePriceOutput">
<part name="body" element="xsd1:TradePrice"/>
</message>
<portType name="StockQuotePortType">
<operation name="GetLastTradePrice">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>
<binding name="StockQuoteSoapBinding"
type="tns:StockQuotePortType">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetLastTradePrice">
<soap:operation
soapAction="http://example.com/GetLastTradePrice"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="StockQuoteService">
<documentation>My first service</documentation>
<port name="StockQuotePort" binding="tns:StockQuoteBinding">
<soap:address location="http://example.com/stockquote"/>
</port>
</service>
</definitions>





它包含了以下的關鍵信息:
· 消息的描述和格式定義可以通過XML文檔中的和 標記來傳送。
· 標記中表示了消息傳送機制。 (e.g. request-only, request-response, response-only) 。
· 標記指定了編碼的規範 。
· 標記中表示服務所處的位置 (URL)。

WSDL在UDDI中總是作為一個接口描述文檔。因為UDDI是一個通用的用來註冊WSDL規範的地方,UDDI的規範並不限制任何類型或者格式描述文檔。這些文檔可能是一個WSDL文檔,或者是一個正規的包含導向文檔的Web頁面,也可能只是一個包含聯繫信息的電子郵件地址。

現在Java提供了一個 Java API for WSDL (JWSDL)規範。它提供了一套能快速處理WSDL文檔的方法,並且不用直接對XML文檔進行操作,它會比JAXP更方便,更快速。

圖 3 顯示了如何使用WSDL 和 UDDI。

圖 3

SOAP

當商業用戶通過UDDI找到你的WSDL描述文檔後,他通過可以Simple Object Access Protocol (SOAP) 調用你建立的Web服務中的一個或多個操作。

SOAP是XML文檔形式的調用商業方法的規範,它可以支持不同的底層接口,像HTTP(S)或者SMTP。之所以使用XML是因為它的獨立於編程語言,良好的可擴展性以及強大的工業支持。之所以使用HTTP是因為幾乎所有的網絡系統都可以用這種協議來通信,由於它是一種簡單協議,所以可以與任何系統結合,還有一個原因就是它可以利用80端口來穿越過防火牆。 SOAP的強大是因為它簡單。SOAP是一種輕量級的,非常容易理解的技術,並且很容易實現。它有工業支持,可以從各主要的電子商務平台供應商那裡獲得。

從技術角度來看,SOAP詳細指明了如何響應不同的請求以及如何對參數編碼。一個SOAP封裝了可選的頭信息和正文,並且通常使用HTTP POST方法來傳送到一個HTTP 服務器,當然其他方法也是可以的,例如SMTP。SOAP同時支持消息傳送和遠程過程調用。以下是一個SOAP請求。




POST /StockQuote HTTP/1.1
Host: www.stockquoteserver.com
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
SOAPAction: "Some-URI"


<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
<SOAP-ENV:Header>
<t:Transaction xmlns:t="some-URI" SOAP-ENV:mustUnderstand="1">
5
</t:Transaction>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<m:GetLastTradePrice xmlns:m="Some-URI">
<symbol>SUNW</symbol>
</m:GetLastTradePrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>





JAX/RPC

為了使開發人員專注於建立象SOAP那樣的基於XML的請求,JCP正在開發基於RPC (JAX/RPC) 的Java API。JAX/RPC是用來發送和接收方法調用請求的,它基於XML協議,像SOAP,或者其他的象XMLP (XML Protocol,要瞭解更多可以參考http://www.w3.org/2000/xp/)。JAX/RPC使你不用再關注這些協議的規範,使應用的開發更快速。不久,開發人員就不用直接以XML表示方法調用了。

目前有很多第三方實現了SOAP,開發人員可以在不同的層次上調用SOAP,並選擇使用哪一種。將來,JAX/RPC會取代這些APIs並提供一個統一的接口來構造以及處理SOAP RPC請求。

在接收一個從商業夥伴那裡過來的SOAP請求的時候,一個Java servlet用JAX/RPC來接收這個基於XML的請求。一旦接收到請求後,servlet會調用商務方法,並且把結果回復給商業夥伴。

ebXML 對於具有高擴展性的商業交易來說,他們需要一種可信任的結構來實現商業事務,多請求的事務,計劃以及文檔流程,應用的需求經常超越了基於純SOAP的實現。因為SOAP只是提供了一個底層的結構,而你可能需要一個更高級的框架結構。

ebXML就是為了這個目的的,它是一套處理B2B應用間的合作與通信的XML規範。以下是ebXML中的關鍵組件:

Collaboration Protocol Profile (CPP)

CPP提供了一種標準並且簡單的方法描述了公司提供的產品。另外,它還描述了消息交換的能力以及公司支持的商務合作。它也描述了公司的商務處理方法,包括合夥人如何與公司合作。CPP定義了B2B交易中雙方的商務協作。例如,它同時定義了買賣雙方的商務處理方法。

Collaboration Protocol Agreement (CPA)

CPA描述了兩個公司之間進行交易時的詳細需求以及機制。它包含有由手工或者自動從經過買賣雙方認可的CPPs中的信息。這個CPA是雙方進行指定交易的合約。 CPP和CPA的樣例,以及關於規範的細節可以從以下網站獲得:

http://ebxml.org/project_teams/trade_partner/cpp-example.xml
http://ebxml.org/project_teams/trade_partner/cpa-example.xml
http://www.ebxml.org/specs/ebCCP.pdf

Business Process and Information Modeling

ebXML還以XML的形式描述了商業事務處理的規範。它包括交易,文檔流程,數字通信,數據封裝格式以及其他更多。這些規範是用來建立CPPs,描述以及共享商業事務和信息時用的。

Core Components

ebXML中另外一個重要的部分是一系列的XML標記,我們叫它核心組件。這些標記包含了商務數據,像日期,稅,賬戶,交易合同以及其他的。它指明了商業合約和實體,但對每個不同的行業,可能都不一樣。

Messaging

ebXML消息格式包含了所有相關的消息導向信息(同步或者異步,可靠性)。一般來說,一個ebXML消息包含了CPA中的可視化內容,並強制執行交易規則。 EbXML是建立在SOAP消息封裝機制上的。它擴展了SOAP的協議,增加了多層框架結構來支持附件,安全性以及傳送的可靠性。

Registry/Repository

EbXML註冊中心是存儲CPPs, CPAs, ebXML核心組件和與ebXML相關的文檔的服務。它具有強大的查詢功能,允許用戶查找相關的組件以及發掘潛在客戶。JAXR API也可以用來訪問ebXML註冊中心。商業服務定義了CPPs,並且被存儲在ebXML註冊中心,然後發佈到UDDI中。一個關鍵的概念是,UDDI提供了一個全球唯一的Web服務的描述信息,但那些真實的信息,還是保存在本地的ebXML庫中。這樣的話,一個潛在的客戶首先到UDDI中查找相關內容,然後根據這些到ebXML庫中找CPPs或者其他相關文檔。

JAXM

當從商業合作夥伴那裡接收一個Web服務的請求時,我們需要Java API實現一個Servlet來處理ebXML消息,就像我們用JAX/RPC來處理SOAP請求一樣。

Java API for XML Messaging (JAXM)

是集成XML消息標準(象ebXML消息或者SOAP消息)的規範。這個API是用來推動XML消息處理的,它檢測那些預定單的消息格式以及約束。它控制了所有的消息封裝機制,用一種直觀的方式分割了消息中的信息,像路由信息,發貨單。這樣,開發人員只要關注消息的有效負載,而不用去擔心那些消息的重複處理。

目前的開發人員用JAXP來實現JAXM將要提供的功能,JAXM將會提供一套非常具有針對性的API來處理基於XML的消息傳送。這將大大簡化開發人員的代碼,並使它們具有統一的接口。

JAXM和JAX/RPC的差別在於處理消息導向的中間件以及遠程過程調用的不同。JAXM注重於消息導向,而JAX/RPC是用來完成遠程過程調用的。以下是圖解。


圖 4

請注意,在JAXM 和 JAX/RPC技術成熟之前,開發人員還是依賴於第三方的SOAP APIs,像Apache SOAP, IdooXOAP, 以及 GLUE。當JAXM 和 JAX/RPC正式發佈後,它將為當前不同的SOAP和ebXML消息提供統一的接口。就像JDBC位多種不同的數據庫提供統一的接口。

以上是對於讓商業合作夥伴訪問你的Web服務的討論。下面我們來討論瘦客戶端和胖客戶端。

Thin Client Connectivity

webasp.net