SOAP 當(dāng)商業(yè)用戶通過UDDI找到你的WSDL描述文檔后,他通過可以Simple Object Access Protocol (SOAP) 調(diào)用你建立的Web服務(wù)中的一個(gè)或多個(gè)操作。 SOAP是XML文檔形式的調(diào)用商業(yè)方法的規(guī)范,它可以支持不同的底層接口,象HTTP(S)或者SMTP。之所以使用XML是因?yàn)樗莫?dú)立于編程語言,良好的可擴(kuò)展性以及強(qiáng)大的工業(yè)支持。之所以使用HTTP是因?yàn)閹缀跛械木W(wǎng)絡(luò)系統(tǒng)都可以用這種協(xié)議來通信,由于它是一種簡單協(xié)議,所以可以與任何系統(tǒng)結(jié)合,還有一個(gè)原因就是它可以利用80端口來穿越過防火墻。 SOAP的強(qiáng)大是因?yàn)樗唵。SOAP是一種輕量級的,非常容易理解的技術(shù),并且很容易實(shí)現(xiàn)。它有工業(yè)支持,可以從各主要的電子商務(wù)平臺(tái)供應(yīng)商那里獲得。 從技術(shù)角度來看,SOAP詳細(xì)指明了如何響應(yīng)不同的請求以及如何對參數(shù)編碼。一個(gè)SOAP封裝了可選的頭信息和正文,并且通常使用HTTP POST方法來傳送到一個(gè)HTTP 服務(wù)器,當(dāng)然其他方法也是可以的,例如SMTP。SOAP同時(shí)支持消息傳送和遠(yuǎn)程過程調(diào)用。以下是一個(gè)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 為了使開發(fā)人員專注于建立象SOAP那樣的基于XML的請求,JCP正在開發(fā)基于RPC (JAX/RPC) 的Java API。JAX/RPC是用來發(fā)送和接收方法調(diào)用請求的,它基于XML協(xié)議,象SOAP,或者其他的象XMLP (XML Protocol,要了解更多可以參考http://www.w3.org/2000/xp/)。JAX/RPC使你不用再關(guān)注這些協(xié)議的規(guī)范,使應(yīng)用的開發(fā)更快速。不久,開發(fā)人員就不用直接以XML表示方法調(diào)用了。 目前有很多第三方實(shí)現(xiàn)了SOAP,開發(fā)人員可以在不同的層次上調(diào)用SOAP,并選擇使用哪一種。將來,JAX/RPC會(huì)取代這些APIs并提供一個(gè)統(tǒng)一的接口來構(gòu)造以及處理SOAP RPC請求。 在接收一個(gè)從商業(yè)伙伴那里過來的SOAP請求的時(shí)候,一個(gè)Java servlet用JAX/RPC來接收這個(gè)基于XML的請求。一旦接收到請求后,servlet會(huì)調(diào)用商務(wù)方法,并且把結(jié)果回復(fù)給商業(yè)伙伴。 ebXML 對于具有高擴(kuò)展性的商業(yè)交易來說,他們需要一種可信任的結(jié)構(gòu)來實(shí)現(xiàn)商業(yè)事務(wù),多請求的事務(wù),計(jì)劃以及文檔流程,應(yīng)用的需求經(jīng)常超越了基于純SOAP的實(shí)現(xiàn)。因?yàn)镾OAP只是提供了一個(gè)底層的結(jié)構(gòu),而你可能需要一個(gè)更高級的框架結(jié)構(gòu)。 ebXML就是為了這個(gè)目的的,它是一套處理B2B應(yīng)用間的合作與通信的XML規(guī)范。以下是ebXML中的關(guān)鍵組件: Collaboration Protocol Profile (CPP) CPP提供了一種標(biāo)準(zhǔn)并且簡單的方法描述了公司提供的產(chǎn)品。另外,它還描述了消息交換的能力以及公司支持的商務(wù)合作。它也描述了公司的商務(wù)處理方法,包括合伙人如何與公司合作。CPP定義了B2B交易中雙方的商務(wù)協(xié)作。例如,它同時(shí)定義了買賣雙方的商務(wù)處理方法。 Collaboration Protocol Agreement (CPA) CPA描述了兩個(gè)公司之間進(jìn)行交易時(shí)的詳細(xì)需求以及機(jī)制。它包含有由手工或者自動(dòng)從經(jīng)過買賣雙方認(rèn)可的CPPs中的信息。這個(gè)CPA是雙方進(jìn)行指定交易的合約。 CPP和CPA的樣例,以及關(guān)于規(guī)范的細(xì)節(jié)可以從以下網(wǎng)站獲得: 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的形式描述了商業(yè)事務(wù)處理的規(guī)范。它包括交易,文檔流程,數(shù)字通信,數(shù)據(jù)封裝格式以及其他更多。這些規(guī)范是用來建立CPPs,描述以及共享商業(yè)事務(wù)和信息時(shí)用的。
Core Components ebXML中另外一個(gè)重要的部分是一系列的XML標(biāo)記,我們叫它核心組件。這些標(biāo)記包含了商務(wù)數(shù)據(jù),象日期,稅,賬戶,交易合同以及其他的。它指明了商業(yè)合約和實(shí)體,但對每個(gè)不同的行業(yè),可能都不一樣。 Messaging ebXML消息格式包含了所有相關(guān)的消息導(dǎo)向信息(同步或者異步,可靠性)。一般來說,一個(gè)ebXML消息包含了CPA中的可視化內(nèi)容,并強(qiáng)制執(zhí)行交易規(guī)則。 EbXML是建立在SOAP消息封裝機(jī)制上的。它擴(kuò)展了SOAP的協(xié)議,增加了多層框架結(jié)構(gòu)來支持附件,安全性以及傳送的可靠性。 Registry/Repository EbXML注冊中心是存儲(chǔ)CPPs, CPAs, ebXML核心組件和與ebXML相關(guān)的文檔的服務(wù)。它具有強(qiáng)大的查詢功能,允許用戶查找相關(guān)的組件以及發(fā)掘潛在客戶。JAXR API也可以用來訪問ebXML注冊中心。商業(yè)服務(wù)定義了CPPs,并且被存儲(chǔ)在ebXML注冊中心,然后發(fā)布到UDDI中。一個(gè)關(guān)鍵的概念是,UDDI提供了一個(gè)全球唯一的Web服務(wù)的描述信息,但那些真實(shí)的信息,還是保存在本地的ebXML庫中。這樣的話,一個(gè)潛在的客戶首先到UDDI中查找相關(guān)內(nèi)容,然后根據(jù)這些到ebXML庫中找CPPs或者其他相關(guān)文檔。 JAXM 當(dāng)從商業(yè)合作伙伴那里接收一個(gè)Web服務(wù)的請求時(shí),我們需要Java API實(shí)現(xiàn)一個(gè)Servlet來處理ebXML消息,就象我們用JAX/RPC來處理SOAP請求一樣。 Java API for XML Messaging (JAXM) 是集成XML消息標(biāo)準(zhǔn)(象ebXML消息或者SOAP消息)的規(guī)范。這個(gè)API是用來推動(dòng)XML消息處理的,它檢測那些預(yù)定單的消息格式以及約束。它控制了所有的消息封裝機(jī)制,用一種直觀的方式分割了消息中的信息,象路由信息,發(fā)貨單。這樣,開發(fā)人員只要關(guān)注消息的有效負(fù)載,而不用去擔(dān)心那些消息的重復(fù)處理。 目前的開發(fā)人員用JAXP來實(shí)現(xiàn)JAXM將要提供的功能,JAXM將會(huì)提供一套非常具有針對性的API來處理基于XML的消息傳送。這將大大簡化開發(fā)人員的代碼,并使它們具有統(tǒng)一的接口。 JAXM和JAX/RPC的差別在于處理消息導(dǎo)向的中間件以及遠(yuǎn)程過程調(diào)用的不同。JAXM注重于消息導(dǎo)向,而JAX/RPC是用來完成遠(yuǎn)程過程調(diào)用的。以下是圖解。
圖 4 請注意,在JAXM 和 JAX/RPC技術(shù)成熟之前,開發(fā)人員還是依賴于第三方的SOAP APIs,象Apache SOAP, IdooXOAP, 以及 GLUE。當(dāng)JAXM 和 JAX/RPC正式發(fā)布后,它將為當(dāng)前不同的SOAP和ebXML消息提供統(tǒng)一的接口。就象JDBC位多種不同的數(shù)據(jù)庫提供統(tǒng)一的接口。 以上是對于讓商業(yè)合作伙伴訪問你的Web服務(wù)的討論。下面我們來討論瘦客戶端和胖客戶端。 Thin Client Connectivity 瘦客戶端(象瀏覽器或者無線設(shè)備)只對瀏覽頁面感興趣。Web服務(wù)的職責(zé)是執(zhí)行需要處理的Web請求,象運(yùn)行B2C交易,然后給出訂單確認(rèn)。 為實(shí)現(xiàn)這個(gè),開發(fā)者用JSP來寫動(dòng)態(tài)頁面。JSP組件技術(shù)時(shí)一種可以根據(jù)后臺(tái)數(shù)據(jù)處理的結(jié)果,來動(dòng)態(tài)生成頁面的技術(shù)。它們在提供JSP組件的容器中運(yùn)行。 JSP可以表現(xiàn)后臺(tái)用各種方法來實(shí)現(xiàn)的業(yè)務(wù)邏輯(e.g. EJBs,普通的Java對象,或者標(biāo)準(zhǔn)的JavaBean)。它可以生成標(biāo)準(zhǔn)的HTML或者XHTML來顯示結(jié)果。 JSP組件與其說是可編程接口,不如說是用戶界面。比方說,一個(gè)股票報(bào)價(jià)服務(wù)可能需要調(diào)用一個(gè)統(tǒng)計(jì)股票平均報(bào)價(jià)的應(yīng)用中的Web服務(wù),然后利用JSP技術(shù)把最終結(jié)果顯示出來。 以下顯示了JSP組件的角色。
圖 5 Thick Client Connectivity 有些Web服務(wù)的連接適合用胖客戶端。比方說,公司的內(nèi)部網(wǎng)。用戶界面的響應(yīng)以及功能可能更加重要。 一個(gè)胖客戶端可以用很多種方法來聯(lián)接Web服務(wù)。比方說,可以用UDDI, WSDL, SOAP以及ebXML。這是一個(gè)性能比較低的例子,因?yàn)榭蛻舳撕头⻊?wù)端可能是由同樣的開發(fā)組開發(fā)的,所以不需要處理很多的XML傳送或者解析。 一個(gè)提高性能的方法是,胖客戶端通過其他更有效的端口來聯(lián)接,象Java RMI-IIOP。 V. Implementing Web Services 現(xiàn)在我們來看,如何在內(nèi)部實(shí)現(xiàn)Web服務(wù)。 數(shù)據(jù)傳送和轉(zhuǎn)換 在進(jìn)入Web服務(wù)之前,我們必須解決如何把傳送進(jìn)來的XML數(shù)據(jù)轉(zhuǎn)換成我們自己的服務(wù)能夠方便處理的格式,然后再把處理結(jié)果轉(zhuǎn)換成XML格式返回給客戶。因此一個(gè)開發(fā)人員需要一個(gè)強(qiáng)壯的機(jī)制來解析XML文件,綁定到Java對象,生成XML文件,并且傳送各種不同的XML格式文件。有時(shí)由于我們的應(yīng)用程序支持不同的接口(例如:B2B伙伴的SOAP,基于瀏覽器的HTML格式,或者是無線的WML訪問同樣的Web服務(wù))我們可能需要不同的服務(wù)接口來處理這些不同客戶端傳送過來的請求。 JAXP 用來處理XML的Java APIs是一套Java本地接口,它提供了可插入到XSLT引擎中的接口SAX,DOM。這些構(gòu)成了解析和處理XML文檔的基礎(chǔ)。這些APIs對Web服務(wù)來說,是非常底層的,它給了我們用Java來訪問,修改以及創(chuàng)建XML文檔的全部功能。 For more information, please see: http://java.sun.com/xml/tutorial_intro.html http://java.sun.com/xml/xml_jaxp.html JAXB XML綁定技術(shù)可以把XML文檔和Java對象進(jìn)行自由轉(zhuǎn)換。用JAXB,你可以在后臺(tái)的EJB層,把XML文檔轉(zhuǎn)換成Java對象。同樣你也可以把從EJB中取出的Java對象轉(zhuǎn)換成XML文檔返回給用戶。 JAXB接口提供了比SAX和DOM更高級的方法來處理XML文檔。它提供的特性可以在XML數(shù)據(jù)和Java類之間互相映射,提供了一個(gè)簡單的方法來轉(zhuǎn)換XML數(shù)據(jù)。它比逐個(gè)解析標(biāo)記更簡單。
XSLT 從商業(yè)伙伴那里傳送過來的XML文檔可能和內(nèi)部使用的格式不相同,比方說商業(yè)伙伴那里用"OrderNum",而內(nèi)部使用"OrderID"。 我們經(jīng)常為了響應(yīng)不同的客戶請求,而重新格式化XML數(shù)據(jù)文檔。舉例來說,一個(gè)商業(yè)伙伴的請求可能傳送一個(gè)SOAP表單,而一些瀏覽器用戶可能是一個(gè)XHTML。在一個(gè)更復(fù)雜的系統(tǒng)中,我們可能需要支持很多種不同的表現(xiàn)形式,象WML表單或者VoiceXML。這要求我們有一種機(jī)制來把各種XML以基本的XML響應(yīng)格式來傳送給我們系統(tǒng)中不同的接口。 XML Stylesheet Language Transformations (XSLT) 是一種轉(zhuǎn)換XML格式的機(jī)制。一個(gè)stylesheet可以指定一系列的模版對應(yīng)規(guī)則,并把它們賦給一個(gè)可遞歸的,象DOM這樣的模型。一個(gè)XSLT引擎可以用stylesheet來轉(zhuǎn)換XML文檔。XSLT stylesheet的語法是非常有表現(xiàn)力的,包含了循環(huán),條件和數(shù)學(xué)表達(dá)式等。還有類似于函數(shù)(function)的機(jī)構(gòu)和概念上的遞歸。 Shared Context 當(dāng)兩個(gè)商業(yè)發(fā)生交易的時(shí)候,通常有一個(gè)上下文的關(guān)系。這個(gè)關(guān)系是指定給合作伙辦的一個(gè)協(xié)議,或者是一種商業(yè)規(guī)則,這樣就可以給不同的合作伙伴進(jìn)行交易。此外,一個(gè)商業(yè)協(xié)作在一段時(shí)間內(nèi)可能調(diào)用不同的接口。每一個(gè)這樣的調(diào)用都是處理同一個(gè)商業(yè)關(guān)系的,可能出現(xiàn)在整個(gè)商業(yè)生命周期中。 在J2EE Web服務(wù)中,為這個(gè)關(guān)系建一個(gè)離散的位置是一種建議的實(shí)現(xiàn)方法。作為一個(gè)開發(fā)人員,你應(yīng)該在復(fù)雜的Web服務(wù)中需要這樣的關(guān)系,并且為你的系統(tǒng)結(jié)構(gòu)設(shè)計(jì)一個(gè)離散的組件來控制它。目前這種關(guān)系是通過數(shù)據(jù)庫訪問(JDBC)來實(shí)現(xiàn)的。但是,Context API可以把Web服務(wù)中需要對這種關(guān)系的訪問操作作為一種流控制。這樣,這些共享的數(shù)據(jù)就可以由各種組件來訪問,象Servlet, JSP或者EJB組件。 Business Layer 當(dāng)傳送進(jìn)來的XML數(shù)據(jù)被轉(zhuǎn)換成Java對象后,這個(gè)數(shù)據(jù)已經(jīng)準(zhǔn)備被傳送到EJB商務(wù)層做處理。EJB技術(shù)是一種用Java來創(chuàng)建商業(yè)組件的標(biāo)準(zhǔn)。用EJB組件,你可以從容器中得到一些服務(wù),象安全性,狀態(tài)保持,連接池,負(fù)載平衡以及失敗恢復(fù)。 在EJB2.0標(biāo)準(zhǔn)中有3中EJB組件: Session Beans 進(jìn)行客戶端的工作。一般來說,Session Bean生命周期短,執(zhí)行快速的操作,象提交訂單,計(jì)算交易稅額。 Entity Beans 表現(xiàn)商業(yè)數(shù)據(jù)。一般來說,Entity Bean生命周期長,并且映射到后臺(tái)的存儲(chǔ)介質(zhì)內(nèi),象RDBMS或者OODBMS系統(tǒng)。Entity Bean分為兩種類型:bean-managed persistent 和container-managed persistent MessageDriven Beans 是消息導(dǎo)向組件。它們通過消息導(dǎo)向中間件來接收消息象IBM MQSeries或者TIBCO Rendezvous。消息也可以通過Java客戶端利用Java Message Service (JMS) 標(biāo)準(zhǔn)來發(fā)送。當(dāng)消息到達(dá)后,一般用JMS API來訪問。 一般來說,session beans 通過調(diào)用entity bean來完成希望的操作。比方說,一個(gè)用來計(jì)算訂單價(jià)格的session bean,可能調(diào)用到表示產(chǎn)品和訂單的entity bean。 Message-driven beans 用來接收消息,或者傳送消息到那些session beans 或者 entity beans. 圖6顯示了一個(gè)EJB組件交互的機(jī)制。 你可以用Java Naming和JNDI API來創(chuàng)建,查找以及刪除EJB組件。這個(gè)API是用來訪問J2EE發(fā)布系統(tǒng)中外部資源的標(biāo)準(zhǔn)API,可以訪問包括數(shù)據(jù)庫驅(qū)動(dòng),消息中間件,或者創(chuàng)建EJB的程序。 更多 EJB資料, 請查閱: ·http://java.sun.com/products/ejb/white/white_paper.html ·http://java.sun.com/products/ejb/ ·http://www.theserverside.com ·"Mastering Enterprise JavaBeans" by Ed Roman, published by John Wiley & Sons. VI. Performing Back-End Integration 最后來討論用J2EE來開發(fā)Web服務(wù)的時(shí)候,如何與后臺(tái)系統(tǒng)相連,象數(shù)據(jù)庫,原先的系統(tǒng)和其他的商業(yè)伙伴。 Database Connectivity 為了聯(lián)接關(guān)系數(shù)據(jù)庫,開發(fā)人員必須選擇APIs: The JDBC API 是一個(gè)用來訪問支持SQL的關(guān)系數(shù)據(jù)庫API.。(這個(gè)相信大家都知道了。) SQL/J 是用Java編寫的標(biāo)準(zhǔn)的嵌入式SQL。類似于在HTML中嵌入JSP組件。 Legacy System Connectivity 在企業(yè)級開發(fā)中,與現(xiàn)存的系統(tǒng)相連接,一直都是一個(gè)比較困難的任務(wù)。大部分企業(yè)應(yīng)用都是一個(gè)大雜燴,包含象SAP R/3, Siebel, i2以及一些客戶服務(wù)系統(tǒng)。整合工作是一個(gè)手工任務(wù),因?yàn)閷ΜF(xiàn)存的系統(tǒng)可用方案并不多。軟件獨(dú)立開發(fā)商被要求編寫一個(gè)在任何平臺(tái)上都可以運(yùn)行的客戶適配器,但這缺乏一個(gè)統(tǒng)一的標(biāo)準(zhǔn)平臺(tái)。 J2EE Connector Architecture (JCA) 是在工業(yè)中應(yīng)用的,一個(gè)針對現(xiàn)存系統(tǒng)的適配器。你可以用它來連接現(xiàn)在的系統(tǒng),或者編寫你自己的適配器。它可以運(yùn)行在與任何J2EE兼容的環(huán)境中。 用 JCA,你只要編寫一個(gè)適配器,就可以在任何J2EE環(huán)境中運(yùn)行。對于軟件獨(dú)立開發(fā)商來說,這為他們提供了一個(gè)整合現(xiàn)存系統(tǒng)的方案。事實(shí)上,這些適配器正在開發(fā)中,對最終開發(fā)者來說,這的確是令人激動(dòng)的。 Business Partner Connectivity 后臺(tái)系統(tǒng)的最后一個(gè)類型是商業(yè)伙伴的Web服務(wù)。商業(yè)伙伴用全球認(rèn)定的XML標(biāo)準(zhǔn)來暴露出一些他們自己的系統(tǒng),在我們發(fā)布自己的Web服務(wù)時(shí),可能會(huì)用到他們的這些服務(wù)。一般來說,UDDI用來注冊Web服務(wù),WSDL用來描述Web服務(wù),SOAP和ebXML用來處理商務(wù)交易。 你的EJB組件可以調(diào)用JAP套件來訪問商業(yè)伙伴的Web服務(wù),這在之前已經(jīng)介紹過了。 用 Java API for XML Registries (JAXR) 在UDDI注冊中心查找商業(yè)伙伴的Web服務(wù)。 用 Java API for XML RPC (JAX/RPC) 處理到外部Web服務(wù)的請求。 用 Java API for XML Messaging (JAXM) 發(fā)送SOAP 或者 ebXML 消息到外部Web服務(wù)。 用 Java API for XML Parsing (JAXP) and the Java API for XML Binding (JAXB) 把Java數(shù)據(jù)轉(zhuǎn)換成適用于合作伙伴的XML格式。同樣可以用來把合作伙伴那邊的數(shù)據(jù)轉(zhuǎn)換成易于自己處理的XML格式,或者進(jìn)行XSLT數(shù)據(jù)轉(zhuǎn)換。 結(jié)合使用Java標(biāo)準(zhǔn)APIs和J2EE Web服務(wù)構(gòu)架,我們就可以建立強(qiáng)大的跨平臺(tái)的系統(tǒng)。利用它們,我們可以與商業(yè)伙伴共享數(shù)據(jù),提供完整的end-to-end的Web服務(wù)解決方案。見圖7。
|