Java技術(shù)社團(tuán)大約一年以前就在不懈地努力,想通過
Java Community Process開發(fā)出用于Web服務(wù)的一組全面的標(biāo)準(zhǔn)Java API。有一些活動(dòng)仍在進(jìn)行中,而其他活動(dòng)則已經(jīng)完成或接近完成。在本文中,我將首次給出用于Web服務(wù)的所有Java API的一個(gè)快速概覽,然后再詳細(xì)介紹三個(gè)用于Web服務(wù)的核心Java API:用于XML消息傳遞的Java API(Java API for XML Messaging,JAXM)、用于遠(yuǎn)程過程調(diào)用的Java API(Java API for Remote Procedure Call,JAX-RPC)和用于XML注冊(cè)的Java API(Java API for XML Registry,JAXR)。Java API用于Web服務(wù)。中國IT動(dòng)力uMHNXr1
首先讓我們來研究Web服務(wù)體系結(jié)構(gòu)的核心構(gòu)件。你起碼需要一種標(biāo)準(zhǔn)的方式來描述Web服務(wù)。另外還必須有一個(gè)注冊(cè)機(jī)制,通過該機(jī)制,服務(wù)提供者可以發(fā)布服務(wù),然后服務(wù)使用者可以發(fā)現(xiàn)服務(wù)。然后還必須有一種標(biāo)準(zhǔn)的方式,用于通過基于XML的消息的交換來調(diào)用服務(wù)。最后,為了在互聯(lián)網(wǎng)上完成業(yè)務(wù)事務(wù),還必須有一種標(biāo)準(zhǔn)的電子業(yè)務(wù)框架,用于定義業(yè)務(wù)合作的語義。中國IT動(dòng)力uMHNXr1
下面的圖1演示了Web服務(wù)的這些核心構(gòu)件以及它們相應(yīng)的標(biāo)準(zhǔn)。首先,SOAP(簡(jiǎn)單對(duì)象訪問協(xié)議)或ebXML消息傳遞服務(wù)用于服務(wù)調(diào)用,統(tǒng)一描述、發(fā)現(xiàn)和集成(Universal Description, Discovery and Integration,UDDI)或ebXML注冊(cè)和存儲(chǔ)用于服務(wù)發(fā)布和發(fā)現(xiàn),而WSDL(Web服務(wù)描述語言)用于基本服務(wù)描述。中國IT動(dòng)力uMHNXr1
中國IT動(dòng)力uMHNXr1
圖1:Web服務(wù)標(biāo)準(zhǔn)中國IT動(dòng)力uMHNXr1
現(xiàn)在,讓我們快速復(fù)習(xí)一下用于Web服務(wù)的這些構(gòu)件的Java API。首先,對(duì)于服務(wù)描述有JSR 110,即用于WSDL的Java API。該API將讓你創(chuàng)建、處理和查詢WSDL文檔。但是,該API一般應(yīng)該由工具提供商來使用。一個(gè)更重要的JSR是JAX-RPC,這是一個(gè)特別從開發(fā)者的角度出發(fā)的API。JAX-RPC定義如何將WSDL文檔映射到相應(yīng)的Java API表示,反之亦然。JAXR用于服務(wù)注冊(cè)和發(fā)現(xiàn)及管理。而對(duì)于服務(wù)調(diào)用,JAXM和JAX-RPC將成為重要的工具。下表列出了與Web服務(wù)相關(guān)的所有Java API。中國IT動(dòng)力uMHNXr1
用于Web 服務(wù)的Java API中國IT動(dòng)力uMHNXr1
種類中國IT動(dòng)力uMHNXr1
Web服務(wù)功能中國IT動(dòng)力uMHNXr1
Java API中國IT動(dòng)力uMHNXr1
當(dāng)前狀態(tài)
(2002年1月)中國IT動(dòng)力uMHNXr1
服務(wù)描述、消息傳遞、注冊(cè)中國IT動(dòng)力uMHNXr1
WSDL文檔管理中國IT動(dòng)力uMHNXr1
JSR 110 (Java API for WSDL)中國IT動(dòng)力uMHNXr1
正在進(jìn)行專家討論中國IT動(dòng)力uMHNXr1
WSDL到Java的映射中國IT動(dòng)力uMHNXr1
JSR 101 (JAX-RPC, Java API for XML-based RPC)中國IT動(dòng)力uMHNXr1
正在進(jìn)行公共評(píng)審中國IT動(dòng)力uMHNXr1
XML消息傳遞(SOAP和ebXML消息服務(wù))中國IT動(dòng)力uMHNXr1
JSR 67 (JAXM, Java API for XML messaging 1.0)中國IT動(dòng)力uMHNXr1
發(fā)布于2001年11月中國IT動(dòng)力uMHNXr1
XML注冊(cè)(UDDI和ebXML reg/rep)中國IT動(dòng)力uMHNXr1
JSR 93(JAXR, Java API for XML registries 1.0)中國IT動(dòng)力uMHNXr1
正在進(jìn)行第2階段的公共評(píng)審中國IT動(dòng)力uMHNXr1
ebXML中國IT動(dòng)力uMHNXr1
ebXML CPP/CPA 文檔管理中國IT動(dòng)力uMHNXr1
JSR 157 (ebXML CPP/CPA API for Java)中國IT動(dòng)力uMHNXr1
正在進(jìn)行專家討論中國IT動(dòng)力uMHNXr1
J2EE和Web 服務(wù)中國IT動(dòng)力uMHNXr1
企業(yè)Web服務(wù)中國IT動(dòng)力uMHNXr1
JSR 109 (Implementing Enterprise Web Services)中國IT動(dòng)力uMHNXr1
在2002年1月22日進(jìn)行了社團(tuán)評(píng)審中國IT動(dòng)力uMHNXr1
J2EE的Web服務(wù)框架中國IT動(dòng)力uMHNXr1
JSR 151 (J2EE 1.4)中國IT動(dòng)力uMHNXr1
正在進(jìn)行專家討論中國IT動(dòng)力uMHNXr1
基于XML的事務(wù)中國IT動(dòng)力uMHNXr1
JSR156 (XML Transactioning API for Java, JAXTA)中國IT動(dòng)力uMHNXr1
正在進(jìn)行專家討論中國IT動(dòng)力uMHNXr1
XML文檔管理中國IT動(dòng)力uMHNXr1
XML文檔解析和轉(zhuǎn)換中國IT動(dòng)力uMHNXr1
JSR 5 (JAXP, XML Parsing)中國IT動(dòng)力uMHNXr1
發(fā)布于2001年3月中國IT動(dòng)力uMHNXr1
XML數(shù)據(jù)綁定中國IT動(dòng)力uMHNXr1
JSR 31 (JAXB, XML Data binding)中國IT動(dòng)力uMHNXr1
正在進(jìn)行專家討論中國IT動(dòng)力uMHNXr1
安全中國IT動(dòng)力uMHNXr1
基于XML的身份驗(yàn)證和不可抵賴中國IT動(dòng)力uMHNXr1
JSR 105 (XML Digital Signature APIs)中國IT動(dòng)力uMHNXr1
正在進(jìn)行專家討論中國IT動(dòng)力uMHNXr1
基于XML的機(jī)密性中國IT動(dòng)力uMHNXr1
JSR 106 (XML Digital Encryption APIs)中國IT動(dòng)力uMHNXr1
正在進(jìn)行專家討論中國IT動(dòng)力uMHNXr1
信任服務(wù)中國IT動(dòng)力uMHNXr1
JSR 104 (XML Trust Service APIs)中國IT動(dòng)力uMHNXr1
正在進(jìn)行專家討論中國IT動(dòng)力uMHNXr1
安全斷言中國IT動(dòng)力uMHNXr1
JSR 155 (Web Services Security Assertion)中國IT動(dòng)力uMHNXr1
正在進(jìn)行專家討論中國IT動(dòng)力uMHNXr1
對(duì)于電子業(yè)務(wù)框架,帶有ebXML消息傳遞服務(wù)描述的JAXM讓你利用較高級(jí)別的消息傳輸語義執(zhí)行服務(wù)調(diào)用,主要是在安全和可靠領(lǐng)域。JAXR還支持ebXML reg/rep作為一個(gè)基礎(chǔ)注冊(cè)提供者。還有一個(gè)新的JSR,即JSR-157,它的目標(biāo)是為創(chuàng)建、操縱和處理ebXML CPP/CPA文檔定義一個(gè)標(biāo)準(zhǔn)的Java API。中國IT動(dòng)力uMHNXr1
還有其他兩個(gè)非常重要的JSR活動(dòng),它們的目標(biāo)是在Java 2 Platform, Enterprise Edition (J2EE)上定義一個(gè)公共的Web服務(wù)框架:JSR 109(即企業(yè)Web服務(wù))和JSR 151(即J2EE 1.4——下一版本的J2EE體現(xiàn)結(jié)構(gòu))。JSR 109和J2EE 1.4體系結(jié)構(gòu)將采用JAXM、JAX-RPC和JAXR作為核心結(jié)構(gòu)組件,以建立J2EE作為Web服務(wù)的開發(fā)和部署平臺(tái)。 中國IT動(dòng)力uMHNXr1
還有用于XML文檔管理的Java API,其中JAXP用于XML文檔的解析和轉(zhuǎn)換,而JAXB用于XML數(shù)據(jù)綁定。Java技術(shù)社團(tuán)還努力定義用于基于XML的安全模式的API,這些API包括用于XML數(shù)字簽名的JSR 105、用于XML加密的JSR 106、用于信任服務(wù)的JSR 104和用于定義安全斷言標(biāo)記語言(Security Assertions Markup Language,SAML)的Java API的JSR 155。中國IT動(dòng)力uMHNXr1
圖2顯示了J2EE體系結(jié)構(gòu)如何被用作Web服務(wù)開發(fā)和部署的平臺(tái),以及哪些Java API對(duì)于實(shí)現(xiàn)Web服務(wù)是可用的。服務(wù)客戶端(不管是瀏覽器、蜂窩電話,還是其他應(yīng)用)通過用于Web服務(wù)的Java API交換XML數(shù)據(jù)(或者更可能是SOAP消息),從而與基于J2EE技術(shù)的服務(wù)進(jìn)行通信。服務(wù)實(shí)現(xiàn)可以是J2EE平臺(tái)業(yè)務(wù)組件的形式,例如servlets或EJB beans。中國IT動(dòng)力uMHNXr1
中國IT動(dòng)力uMHNXr1
圖2:基于J2EE體系結(jié)構(gòu)的Web服務(wù)體系結(jié)構(gòu)中國IT動(dòng)力uMHNXr1
JAXM 中國IT動(dòng)力uMHNXr1
JAXM為發(fā)送和接收SOAP消息提供一個(gè)標(biāo)準(zhǔn)的Java API。消息結(jié)構(gòu)和編碼規(guī)則是基于SOAP 1.1和SOAP with Attachment (SOAPATTACH)規(guī)范。JAXM還支持一個(gè)框架,高級(jí)的描述可以插入到該框架中,以支持基本SOAP上的擴(kuò)展語義。這些描述的例子有ebXML消息服務(wù)描述和SOAP RP描述。中國IT動(dòng)力uMHNXr1
那么為什么使用JAXM呢?就像任何其他Java技術(shù)一樣,JAXM提供一個(gè)標(biāo)準(zhǔn)的Java API,所以應(yīng)用可以移植。JAXM還提供一個(gè)靈活的體系結(jié)構(gòu),在這種結(jié)構(gòu)中,提供商可以在維護(hù)你的應(yīng)用的可移植性的同時(shí)參加它們的實(shí)現(xiàn)。例如,我們后面將會(huì)講到,提供商可以實(shí)現(xiàn)帶有增加值特性(比如更高的可靠性或智能路由)的JAXM提供者。中國IT動(dòng)力uMHNXr1
圖3顯示了JAXM(和就這點(diǎn)而論的JAX-RPC)的相互操作模型。前面已經(jīng)提到過,JAXM為發(fā)送和接收SOAP消息提供一個(gè)標(biāo)準(zhǔn)的Java API。只要基礎(chǔ)XML和傳輸協(xié)議是基于HTTP上的SOAP、JAXM或JAX-RPC,應(yīng)用就應(yīng)該可以與它們的對(duì)等體相互操作,而不管這些對(duì)等體是編寫為通過非-JAXM API或者是以Java以外的編程語言編寫的這一事實(shí)。中國IT動(dòng)力uMHNXr1
中國IT動(dòng)力uMHNXr1
圖3:JAXM相互操作模型中國IT動(dòng)力uMHNXr1
JAXM結(jié)構(gòu)角色中國IT動(dòng)力uMHNXr1
在JAXM運(yùn)行時(shí)環(huán)境中,可以有兩個(gè)結(jié)構(gòu)角色。一個(gè)是JAXM消息提供者(或者叫做JAXM提供者),另一個(gè)是JAXM客戶。而JAXM客戶又可以是兩種類型中的一種——一種使用JAXM提供者,另一種不使用JAXM提供者。(順便說一下,我們使用術(shù)語“JAXM客戶”是指JAXM API的一個(gè)用戶,而不是從傳統(tǒng)客戶和服務(wù)器通信模型的角度出發(fā)。例如,JAXM客戶可以提供可被其他客戶調(diào)用的SOAP服務(wù),或者該服務(wù)將從遠(yuǎn)程SOAP服務(wù)調(diào)用一個(gè)服務(wù)。所以把“JAXM客戶”叫做“JAXM應(yīng)用”更合適。但是既然JAXM規(guī)范使用術(shù)語“JAXM客戶”,我們也就使用它吧)。不使用JAXM提供者的JAXM客戶叫做獨(dú)立的JAXM客戶。中國IT動(dòng)力uMHNXr1
JAXM消息提供者在后臺(tái)以JAXM客戶的名義工作,提供消息路由和可靠消息傳遞等功能,例如,通過分配消息標(biāo)識(shí)符或永久地在內(nèi)部保留著消息。事實(shí)上,不同的提供者提供的功能變化很大。JAXM提供者的服務(wù)是通信結(jié)構(gòu)的組成部分,而不是特定于某個(gè)應(yīng)用。因此,這些服務(wù)對(duì)JAXM客戶是完全透明的,JAXM客戶不了解提供者,除非建立了一個(gè)到該提供者的連接。中國IT動(dòng)力uMHNXr1
正如前面所提到的,有兩種類型的JAXM客戶——一種使用JAXM消息提供者,另一種不使用JAXM消息提供者。既然解釋不使用JAXM消息提供者的JAXM客戶比較容易,那么我們就先來討論這種JAXM客戶。不使用JAXM消息提供者的JAXM客戶是一個(gè)獨(dú)立的Java 2 Platform, Standard Edition (J2SE)應(yīng)用,因?yàn)樵摽蛻魬?yīng)用有所有需要的Java類在它的地址空間中。但是獨(dú)立的JAXM客戶只可以在點(diǎn)到點(diǎn)的操作模式中工作。另外,獨(dú)立的JAXM客戶只可以發(fā)送消息到特定的目的。如果基礎(chǔ)傳輸協(xié)議是HTTP,那么該目的可以表示為URL。獨(dú)立的JAXM客戶也只在同步模式中工作。也就是說,它基本上以請(qǐng)求-響應(yīng)交互模型工作,因而不能以異步模式接收消息。中國IT動(dòng)力uMHNXr1
現(xiàn)在我們來討論使用JAXM消息提供者的JAXM客戶類型。在這種情況下,JAXM客戶維持著一個(gè)與JAXM消息提供者的連接,并且該客戶發(fā)送或接收的所有消息都通過該JAXM消息提供者。在大多數(shù)Web消息傳遞場(chǎng)景中,JAXM客戶將使用一個(gè)JAXM消息提供者。在這種場(chǎng)景中,JAXM客戶被部署到一個(gè)容器中,這意味著它既可以同步發(fā)送消息,也可以異步發(fā)送消息。容器可以是J2EE Web容器或者是EJB容器。如果JAXM客戶被部署在EJB容器中,那么很可能該JAXM客戶是消息驅(qū)動(dòng)Bean的形式;如果它被部署在Web容器中,它就擴(kuò)展JAXMServlet類。中國IT動(dòng)力uMHNXr1
JAXM消息傳遞描述中國IT動(dòng)力uMHNXr1
JAXM的一個(gè)重要特性就是支持高級(jí)別的消息傳遞描述。通過為指定高級(jí)別的語義(比如安全性、可靠性、事務(wù)和管理)而規(guī)定SOAP頭的一個(gè)特定用法,消息傳遞描述運(yùn)行在基本SOAP上。 SOAP的基本形式不支持基于尋址或基于消息傳遞的會(huì)話方案,也就是說,基本的SOAP消息沒有任何用于尋址信息(比如發(fā)送者、接收者、消息ID和相關(guān)信息)的字段。描述在這一領(lǐng)域也有幫助。JAXM可以支持很多工業(yè)標(biāo)準(zhǔn)消息描述,一個(gè)主要的例子是ebXML消息服務(wù)描述。中國IT動(dòng)力uMHNXr1
JAXM包中國IT動(dòng)力uMHNXr1
圖4顯示了JAXM應(yīng)用及其使用的基礎(chǔ)Java應(yīng)用包的一個(gè)分層視圖。JAXM應(yīng)用可以使用三種不同層次的API。在最頂層有由高級(jí)別描述(比如ebXML消息傳遞服務(wù)描述)暴露的編程API。JAXM應(yīng)用也可以使用由JAXM消息傳遞包暴露的API或由JAXM SOAP包暴露的API。這些三層API集合中的每一層都提供不同的功能:描述API用于訪問和處理特定于描述的SOAP頭、JAXM消息傳遞API用于提供消息傳遞(例如,與JAXM消息提供者通信)的一個(gè)抽象和SOAP API用于創(chuàng)建及處理SOAP消息頭與消息體結(jié)構(gòu)。中國IT動(dòng)力uMHNXr1
中國IT動(dòng)力uMHNXr1
圖4:JAXM分層視圖中國IT動(dòng)力uMHNXr1
JAXM部署中國IT動(dòng)力uMHNXr1
JAXM應(yīng)用可以分別打包為Web應(yīng)用或J2EE平臺(tái)應(yīng)用,及部署到Servlet 2.2和/或J2EE 1.3容器中??梢灶A(yù)期到,J2EE規(guī)范(J2EE 1.4)的未來版本將會(huì)包含JAXM特定的部署信息。獨(dú)立的JAXM應(yīng)用只實(shí)現(xiàn)一種請(qǐng)求-響應(yīng)形式的消息傳遞,這種應(yīng)用可以被認(rèn)為是J2SE應(yīng)用,并且不會(huì)為這樣的應(yīng)用引入新的部署要求。中國IT動(dòng)力uMHNXr1
JAX-RPC 中國IT動(dòng)力uMHNXr1
JAX-RPC是JAXM、JAX-RPC和JAXR這三者之一。JAX-RPC處理SOAP消息傳遞的RPC部分。現(xiàn)在我們來討論JAX-RPC的范圍。首先,它定義Java API和XML數(shù)據(jù)類型映射是如何完成的。例如,當(dāng)SOAP客戶調(diào)用SOAP服務(wù)提供者的一個(gè)方法時(shí),方法的參數(shù)必須從Java對(duì)象映射到相應(yīng)的XML元素。而當(dāng)SOAP服務(wù)提供者接收到一個(gè)SOAP RPC請(qǐng)求消息時(shí),則必須從XML元素映射到相應(yīng)的Java對(duì)象。JAX-RPC也定義WSDL文檔及其元素是如何映射到Java API表示的。例如,WSDL文檔的portType元素被映射到服務(wù)定義接口,這是定義在WSDL文檔中的服務(wù)的抽象部分的Java表示。JAX-RPC也定義運(yùn)行時(shí)API,其中包含stub接口、動(dòng)態(tài)代理、動(dòng)態(tài)調(diào)用,以及最終的編組和解組。Stub類一般由工具產(chǎn)生,并且必須實(shí)現(xiàn)Stub java接口。動(dòng)態(tài)代理由JAX-RPC實(shí)現(xiàn)——JAX-RPC運(yùn)行時(shí)產(chǎn)生,并且它是服務(wù)定義接口的一個(gè)實(shí)現(xiàn)。動(dòng)態(tài)調(diào)用允許客戶在運(yùn)行時(shí)設(shè)置目標(biāo)地址和屬性(比如用戶名和密碼)。中國IT動(dòng)力uMHNXr1
JAX-RPC:XML數(shù)據(jù)類型到Java API的映射中國IT動(dòng)力uMHNXr1
可以映射到Java API類型的XML數(shù)據(jù)類型包括簡(jiǎn)單類型和復(fù)雜類型。簡(jiǎn)單類型包含W3C XML 方案中定義的內(nèi)置的原始類型。例如,字符串?dāng)?shù)據(jù)類型被映射到j(luò)ava.lang.String類,而dateTime數(shù)據(jù)類型被映射到j(luò)ava.util.Calendar類。JAX-RPC規(guī)范地址指出的其他簡(jiǎn)單類型包括數(shù)組和枚舉型。復(fù)雜類型的一個(gè)例子是結(jié)構(gòu)數(shù)據(jù)類型。結(jié)構(gòu)類型被映射到具有相應(yīng)getter和setter方法的JavaBeans組件。下面我們來看兩個(gè)例子。中國IT動(dòng)力uMHNXr1
下面的例子顯示了枚舉數(shù)據(jù)類型是如何映射到相應(yīng)的Java類的。中國IT動(dòng)力uMHNXr1
下載或使用該代碼,你就同意這些
許可條款。中國IT動(dòng)力uMHNXr1
<!-- XML data type definition -------->
<element name="EyeColor" type="tns:EyeColor"/>
<simpleType name="EyeColor">
<restriction base="xsd:string">
<enumeration value="green"/>
<enumeration value="blue"/>
</restriction>
</simpleType>
// Java Representation of a simpleType "EyeColor"
public class EyeColor implements
java.io.Serializable {
// Constructor
protected EyeColor(String value) { ... }
public static final String _green = "green";
public static final String _blue = "blue";
public static final EyeColor
green = new EyeColor(_green);
public static final EyeColor
blue = new EyeColor(_blue);
public String getValue() { ... }
public static EyeColor fromValue(String value)
throws java.lang.IllegalStateException { ... }
public boolean equals(Object obj) { ... }
public int hashCode() { ... }
}中國IT動(dòng)力uMHNXr1
下面的例子顯示XML結(jié)構(gòu)數(shù)據(jù)類型如何以Java類來表示。正如前面所提到的,XML結(jié)構(gòu)類型可以由JavaBean類來表示,該類具有針對(duì)結(jié)構(gòu)的每個(gè)成員的getter和setter方法。中國IT動(dòng)力uMHNXr1
<!-- XML data type definition -------->
<element name="Book"/>
<complexType>
<all>
<element name="author" type="xsd:string"/>
<element name="preface" type="xsd:string"/>
<element name="price" type="xsd:float"/>
<all>
</complexType>
// Java Representation of a structure type "Book" public
class Book implements java.io.Serializable {
// ...
public String getAuthor() { ... }
public void setAuthor(String author) { ... }
public String getPreface() { ... }
public void setPreface(String preface) { ... }
public float getPrice() { ... }
public void setPrice(float price) { ... }
}中國IT動(dòng)力uMHNXr1
JAX-RPC:WSDL到Java API的映射中國IT動(dòng)力uMHNXr1
JAX-RPC處理的另一個(gè)重要領(lǐng)域是描述WSDL文檔及其元素是如何映射到相應(yīng)的Java表示的。JAX-RPC規(guī)范表明,每個(gè)WSDL文檔應(yīng)該映射到獨(dú)立的Java包,而WSDL文檔的抽象元素——portType、operation和message元素——應(yīng)該表示為Java接口類型及其方法。JAX-RPC規(guī)范還定義WSDL文檔的具體綁定部分——綁定、端口、服務(wù)元素——是如何映射到正確的Java API表示的。因此,JAX-RPC規(guī)范定義了一組規(guī)則,關(guān)于如何將WSDL文檔的抽象部分表示為相應(yīng)的Java API表示。首先,portType元素映射到一個(gè)Java接口類型,portType元素是operation元素的集合。該Java接口類型被作為服務(wù)定義接口來調(diào)用。該服務(wù)定義接口擴(kuò)展ava.rmi.Remote。operation元素被映射到服務(wù)定義接口的一個(gè)方法,而message元素被映射到該方法的參數(shù)。因此,讓我們來看一個(gè)例子。中國IT動(dòng)力uMHNXr1
<!----- Abstract part of a WSDL Document
------------------>
<message name="GetLastTradePriceInput">
<part name="tickerSymbol" type="xsd:string"/>
</message>
<message name="GetLastTradePriceOutput"?
<part name="result" type="xsd:float"/>
</message>
<portType name="StockQuoteProvider">
<operation name="GetLastTradePrice"
parameterOrder="tickerSymbol">
<input message="tns:GetLastTradePriceInput"/>
<output message="tns:GetLastTradePriceOutput"/>
</operation>
</portType>
//----------- Service Definition Interface
---------------------//
public interface StockQuoteProvider
extends java.rmi.Remote {
float getLastTradePrice(String tickerSymbol)
throws java.rmi.RemoteException;
}中國IT動(dòng)力uMHNXr1
在上面的例子中,第一部分包含例子WSDL文檔的抽象部分,該例子文檔定義了portType、operation和message元素。(在WSDL文檔中,portType、operation和message元素定義了服務(wù)的抽象部分。portType是operation的集合。Operation是一個(gè)動(dòng)作,在該動(dòng)作中,進(jìn)行輸入/輸出消息的交換以完成動(dòng)作)。例子的底部是Java API表示。在該例子中,portType的名稱StockQuoteProvider以紅色高亮顯示,并被用作服務(wù)定義接口的名稱。Operation的名稱GetLastTradePrice以蘭色高亮顯示,并被轉(zhuǎn)換為相同名稱的方法。請(qǐng)注意,服務(wù)定義接口擴(kuò)展java.rmi.Remote類型,并且每個(gè)方法都拋出java.rmi.RemoteException。另外,服務(wù)定義接口只表示W(wǎng)SDL文檔的抽象部分,也就是說,它不涉及服務(wù)是如何綁定到特定的XML或傳輸協(xié)議的。中國IT動(dòng)力uMHNXr1
WSDL文檔中的service元素表示一個(gè)端口總集,其中每個(gè)端口都定義了特定的綁定。也就是說,有了binding和port元素,service元素將portType元素的抽象定義與具體的XML和傳輸協(xié)議及它們的端點(diǎn)地址綁定在一起;例如,HTTP上的SOAP作為具體的XML和傳輸協(xié)議,而特定的URL作為端點(diǎn)地址。中國IT動(dòng)力uMHNXr1
在JAX-RPC之下,service元素被映射到j(luò)avax.xml.rpc.Service接口類型。javax.xml.rpc.Service類充當(dāng)下面這些東西的工廠:中國IT動(dòng)力uMHNXr1
服務(wù)端口的動(dòng)態(tài)代理。
類型javax.xml.rpc.Call的實(shí)例,該類型用于服務(wù)端口上的遠(yuǎn)程操作的動(dòng)態(tài)調(diào)用。
產(chǎn)生的stub類的實(shí)例。
因此,前一個(gè)例子只處理WSDL文檔的抽象部分,與此相反,WSDL文檔的service元素被轉(zhuǎn)換為javax.xml.rpc.Service類,該類指定了該服務(wù)將如何被調(diào)用。中國IT動(dòng)力uMHNXr1
下一代碼段顯示了例子WSDL文檔的具體綁定部分。在該例子中,叫做StockQuotePortType的portType被綁定到SOAP,SOAP可以支持文檔樣式或RPC樣式。文檔樣式是可以選擇的。最后,該服務(wù)通過一個(gè)通信端點(diǎn)被暴露,該端點(diǎn)由一個(gè)為特定通信協(xié)議指定端點(diǎn)地址的port元素來表示。在該例子中,端點(diǎn)碰巧是URL形式,即http://example.com/stockquote,因?yàn)橛糜趥鬏擲OAP消息的傳輸協(xié)議是HTTP。如果使用的傳輸協(xié)議是SMTP,那么端點(diǎn)將是郵件地址的形式。中國IT動(dòng)力uMHNXr1
<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>中國IT動(dòng)力uMHNXr1
下一代碼段是由JAX-RPC規(guī)范定義的javax.xml.rpc.Service Java接口類型。JAX-RPC 1.0實(shí)現(xiàn)是必需的,以提供給該接口一個(gè)實(shí)現(xiàn)類。也就是說,由平臺(tái)提供商負(fù)責(zé)實(shí)現(xiàn)該接口。該實(shí)現(xiàn)類是必需的,以支持動(dòng)態(tài)代理和javax.xml.rpc.Call對(duì)象的創(chuàng)建。getPort方法為指定的服務(wù)端口返回動(dòng)態(tài)代理。服務(wù)客戶使用該動(dòng)態(tài)代理來調(diào)用目標(biāo)服務(wù)端口上的操作。proxyInterface指定所創(chuàng)建的動(dòng)態(tài)代理支持的服務(wù)定義接口。中國IT動(dòng)力uMHNXr1
package javax.xml.rpc;
public interface Service {
public java.rmi.Remote getPort(QName portName,
Class proxyInterface)
throws JAXRPCException;
public Call createCall(QName portName)
throws JAXRPCException;
public Call createCall(QName portName,
String operationName)
throws JAXRPCException;
public Call createCall()
throws JAXRPCException;
public java.net.URL
getWSDLDocumentLocation();
public QName getServiceName();
public java.util.Iterator getPorts();
}中國IT動(dòng)力uMHNXr1
方法getPorts返回由該服務(wù)成組的端口的一列限定的名稱(像javax.xml.rpc.namespace.QName)。方法createCall的多個(gè)變體創(chuàng)建javax.xml.rpc.Call的實(shí)例。javax.xml.rpc.Call接口為目標(biāo)服務(wù)端口上的操作的動(dòng)態(tài)調(diào)用提供支持。客戶端JAX-RPC 1.0實(shí)現(xiàn)是必需的,以實(shí)現(xiàn)javax.xml.rpc.Call接口。javax.xml.rpc.Service接口充當(dāng)用于創(chuàng)建javax.xml.rpc.Call實(shí)例的工廠。Service實(shí)現(xiàn)類是必需的,以實(shí)現(xiàn)java.io.Serializable和javax.naming.Referenceable實(shí)例來支持JNDI名稱空間中的注冊(cè)。中國IT動(dòng)力uMHNXr1
JAX-RPC:工具中國IT動(dòng)力uMHNXr1
因?yàn)镴AX-RPC定義關(guān)于WSDL文檔如何映射到相應(yīng)Java表示的精確規(guī)則,所以映射過程最好使用工具自動(dòng)完成。因此,WSDL到Java映射工具將讀WSDL文檔,并產(chǎn)生服務(wù)接口及其實(shí)現(xiàn)類,即服務(wù)定義接口。服務(wù)定義接口擴(kuò)展java.rmi.Remote stub類,而該stub類實(shí)現(xiàn)javax.xml.rpc.Stub接口和服務(wù)及stub類所需的任何附加類。這些附加類包括serializer、deserializer和utility類。事實(shí)上,這里以外的許多工具已經(jīng)在做這些事情了,并且JAX-RPC將標(biāo)準(zhǔn)化這一映射過程。中國IT動(dòng)力uMHNXr1
JAX-RPC:可擴(kuò)展的類型映射中國IT動(dòng)力uMHNXr1
JAX-RPC 1.0規(guī)范指定XML數(shù)據(jù)類型和Java類型之間的標(biāo)準(zhǔn)映射。標(biāo)準(zhǔn)類型映射支持SOAP 1.1 編碼和XML Schema規(guī)范中定義的一組XML數(shù)據(jù)類型。標(biāo)準(zhǔn)類型映射也為JAX-RPC 1.0支持的Java類型組指定了XML映射。但是,JAX-RPC 1.0實(shí)現(xiàn)需要支持超出標(biāo)準(zhǔn)類型映射規(guī)范指定的XML數(shù)據(jù)類型和Java類型之間的映射。例如,如果你有自定義的Java數(shù)據(jù)類型,那么它需要被映射到XML表示。中國IT動(dòng)力uMHNXr1
JAX-RPC 1.0指定API以支持可擴(kuò)展類型映射框架。這些API允許可插入串行化器和反串行化器的部署,以支持任何Java API類型和XML數(shù)據(jù)類型之間的可擴(kuò)展映射??刹迦氲拇谢骱头创谢骺梢员淮虬鳛镴AX-RPC 1.0實(shí)現(xiàn)的一部分,或者可以由工具提供商、服務(wù)開發(fā)者和服務(wù)客戶來提供。中國IT動(dòng)力uMHNXr1
使用不同的XML處理機(jī)制和表示,類型映射框架應(yīng)該允許可插入串行化器和反串行化器的部署。但是,JAX-RPC 1.0版本中并沒有解決跨各種JAX-RPC實(shí)現(xiàn)的可插入串行化器和反串行化器的可移植性。中國IT動(dòng)力uMHNXr1
JAX-RPC包中國IT動(dòng)力uMHNXr1
圖5顯示了各種包之間的關(guān)系。RPC包和消息傳遞包都將SOAP包用于創(chuàng)建、操縱和處理SOAP消息。并且RPC包用于RPC,而消息包用于消息傳遞。中國IT動(dòng)力uMHNXr1
中國IT動(dòng)力uMHNXr1
圖5:包關(guān)系中國IT動(dòng)力uMHNXr1
JAXR 中國IT動(dòng)力uMHNXr1
注冊(cè)中心的典型應(yīng)用是什么? 注冊(cè)中心的功能相當(dāng)于一個(gè)電子黃頁, 商業(yè)組織的信息和他們所提供的服務(wù)和產(chǎn)品可以在這里發(fā)布和發(fā)現(xiàn)。注冊(cè)中心也可以當(dāng)作數(shù)據(jù)庫,或者共享信息存儲(chǔ)庫。共享的信息可以是任何東西。注冊(cè)中心也可以看作電子公告板, 合作伙伴就可以以一種動(dòng)態(tài)的、臨時(shí)的方式共享信息。注冊(cè)服務(wù)的典型操作是什么呢?首先,提交和保存共享信息是比較重要的注冊(cè)操作。我們還需要完成各種注冊(cè)管理操作,比如標(biāo)識(shí)、命名、描述、分類、關(guān)聯(lián)、分組和標(biāo)注。最后,我們還必須能夠從注冊(cè)中心完成查詢、發(fā)現(xiàn)和獲取共享的信息等操作。所以任何注冊(cè)中心的編程API都需要支持這些操作。JAXR (Java API for XML Registry) 為在不同的注冊(cè)服務(wù)提供者之間進(jìn)行以上注冊(cè)操縱提供了一套標(biāo)準(zhǔn)的Java API。同時(shí)它也為描述注冊(cè)內(nèi)容定義了一個(gè)統(tǒng)一的信息模型。所以不用考慮要訪問的注冊(cè)服務(wù)提供者,你的程序可以對(duì)通用的信息模型進(jìn)行操作。由于注冊(cè)提供者性能上的多樣性,JAXR設(shè)計(jì)組決定通過性能描述來提供多層API抽象。中國IT動(dòng)力uMHNXr1
JAXR將成為J2EE(J2EE 1.4)的一部分,而J2EE 1.4將會(huì)成為Web服務(wù)開發(fā)和部署的首選平臺(tái)。這就意味著J2EE 1.4平臺(tái)的開發(fā)商們?yōu)榱伺c1.4的標(biāo)準(zhǔn)兼容必須提供JAXR服務(wù)(雖然不一定要是注冊(cè)服務(wù))。中國IT動(dòng)力uMHNXr1
JAXR: 性能描述中國IT動(dòng)力uMHNXr1
在JAXR中,相關(guān)的注冊(cè)服務(wù)特性被分組成一個(gè)性能級(jí)別。每個(gè)性能級(jí)別用一個(gè)java 接口來體現(xiàn),而每個(gè)相同性能級(jí)別中的特性對(duì)應(yīng)于此java接口中的一個(gè)方法. 為了便于測(cè)試兼容性,減少交互協(xié)作中出現(xiàn)的問題,JAXR把性能劃分成較小單位的性能描述集合. 一個(gè)性能描述定義了一類性能的集合(Java接口類型的集合),這些java接口類型的集合必須被整體所支持以符合該性能描述的要求. 目前,JAXR只定義了兩個(gè)性能描述,基本特性的0級(jí)層和高級(jí)特性的1級(jí)層。最低限度下,所有的JAXR提供者必須實(shí)現(xiàn)0級(jí)架構(gòu)。同時(shí)為了便于發(fā)現(xiàn)性能,JAXR還定義了一個(gè)發(fā)現(xiàn)接口,允許客戶端訪問和發(fā)現(xiàn)注冊(cè)服務(wù)的性能.中國IT動(dòng)力uMHNXr1
圖6說明了不同的JAXR客戶端上如何利用JAXR API與不同的注冊(cè)中心進(jìn)行交互操作的。在結(jié)構(gòu)上,JAXR客戶端利用API執(zhí)行注冊(cè)操作,而JAXR提供者實(shí)現(xiàn)這個(gè)API的功能。由于JAXR提供了一個(gè)標(biāo)準(zhǔn)的API來訪問不同的注冊(cè)提供者和描述注冊(cè)內(nèi)容的統(tǒng)一信息模型,無論是HTML瀏覽器、J2EE組件(如servlet 或者EJB beans)或獨(dú)立的J2SE應(yīng)用程序的JAXR客戶端,都能夠統(tǒng)一地對(duì)不同的注冊(cè)提供者執(zhí)行注冊(cè)操作。中國IT動(dòng)力uMHNXr1
中國IT動(dòng)力uMHNXr1
圖6:客戶端與注冊(cè)中心的互操作性 中國IT動(dòng)力uMHNXr1
圖7是JAXR架構(gòu)的描述,底部是現(xiàn)有的注冊(cè)服務(wù)提供者,如ebXML, reg/rep, UDDI和其他類型. 這些注冊(cè)服務(wù)提供者可以被特定注冊(cè)服務(wù)的JAXR提供者訪問。只要被注冊(cè)服務(wù)提供者確認(rèn),特定注冊(cè)服務(wù)的JAXR提供者就可以成為他們的客戶端。從這個(gè)意義上講,特定注冊(cè)服務(wù)的JAXR提供者相當(dāng)于是JAXR客戶端的代理。這種可插拔的JAXR提供者實(shí)現(xiàn)了獨(dú)立于注冊(cè)服務(wù)類型的JAXR API的特性。可插拔的提供者為多樣化的特定注冊(cè)服務(wù)的JAXR提供者定義了單一的抽象。所以客戶端在訪問實(shí)際注冊(cè)服務(wù)的時(shí)候可以不考慮特定注冊(cè)服務(wù)的JAXR提供者的多樣性。這些是與特定性能相關(guān)的接口。中國IT動(dòng)力uMHNXr1
中國IT動(dòng)力uMHNXr1
圖07: JAXR 架構(gòu) 中國IT動(dòng)力uMHNXr1
總結(jié)中國IT動(dòng)力uMHNXr1
正如此文所述,Java技術(shù)組通過堅(jiān)持不懈地努力,為Web服務(wù)提供了一套非常全面的API。這套Java API包括基于XML的消息傳送(JAXM),基于XML的遠(yuǎn)程過程調(diào)用(JAX-RPC),基于XML的注冊(cè)服務(wù)操作(JAXR),為應(yīng)用于Web 服務(wù)的全面完整的Java API的必然出現(xiàn)奠定了堅(jiān)實(shí)基礎(chǔ)。中國IT動(dòng)力uMHNXr1