Java技術(shù)社團(tuán)大約一年以前就在不懈地努力,想通過Java Community Process開發(fā)出用于Web服務(wù)的一組全面的標(biāo)準(zhǔn)Java API。有一些活動仍在進(jìn)行中,而其他活動則已經(jīng)完成或接近完成。在本文中,我將首次給出用于Web服務(wù)的所有Java API的一個快速概覽,然后再詳細(xì)介紹三個用于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注冊的Java API(Java API for XML Registry,JAXR)。Java API用于Web服務(wù)。中國IT動力uMHNXr1
首先讓我們來研究Web服務(wù)體系結(jié)構(gòu)的核心構(gòu)件。你起碼需要一種標(biāo)準(zhǔn)的方式來描述Web服務(wù)。另外還必須有一個注冊機(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動力uMHNXr1
下面的圖1演示了Web服務(wù)的這些核心構(gòu)件以及它們相應(yīng)的標(biāo)準(zhǔn)。首先,SOAP(簡單對象訪問協(xié)議)或ebXML消息傳遞服務(wù)用于服務(wù)調(diào)用,統(tǒng)一描述、發(fā)現(xiàn)和集成(Universal Description, Discovery and Integration,UDDI)或ebXML注冊和存儲用于服務(wù)發(fā)布和發(fā)現(xiàn),而WSDL(Web服務(wù)描述語言)用于基本服務(wù)描述。中國IT動力uMHNXr1
中國IT動力uMHNXr1
圖1:Web服務(wù)標(biāo)準(zhǔn)中國IT動力uMHNXr1
現(xiàn)在,讓我們快速復(fù)習(xí)一下用于Web服務(wù)的這些構(gòu)件的Java API。首先,對于服務(wù)描述有JSR 110,即用于WSDL的Java API。該API將讓你創(chuàng)建、處理和查詢WSDL文檔。但是,該API一般應(yīng)該由工具提供商來使用。一個更重要的JSR是JAX-RPC,這是一個特別從開發(fā)者的角度出發(fā)的API。JAX-RPC定義如何將WSDL文檔映射到相應(yīng)的Java API表示,反之亦然。JAXR用于服務(wù)注冊和發(fā)現(xiàn)及管理。而對于服務(wù)調(diào)用,JAXM和JAX-RPC將成為重要的工具。下表列出了與Web服務(wù)相關(guān)的所有Java API。中國IT動力uMHNXr1
用于Web 服務(wù)的Java API中國IT動力uMHNXr1 |
對于電子業(yè)務(wù)框架,帶有ebXML消息傳遞服務(wù)描述的JAXM讓你利用較高級別的消息傳輸語義執(zhí)行服務(wù)調(diào)用,主要是在安全和可靠領(lǐng)域。JAXR還支持ebXML reg/rep作為一個基礎(chǔ)注冊提供者。還有一個新的JSR,即JSR-157,它的目標(biāo)是為創(chuàng)建、操縱和處理ebXML CPP/CPA文檔定義一個標(biāo)準(zhǔn)的Java API。中國IT動力uMHNXr1
還有其他兩個非常重要的JSR活動,它們的目標(biāo)是在Java 2 Platform, Enterprise Edition (J2EE)上定義一個公共的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ā)和部署平臺。 中國IT動力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動力uMHNXr1
圖2顯示了J2EE體系結(jié)構(gòu)如何被用作Web服務(wù)開發(fā)和部署的平臺,以及哪些Java API對于實(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平臺業(yè)務(wù)組件的形式,例如servlets或EJB beans。中國IT動力uMHNXr1
中國IT動力uMHNXr1
圖2:基于J2EE體系結(jié)構(gòu)的Web服務(wù)體系結(jié)構(gòu)中國IT動力uMHNXr1
JAXM 中國IT動力uMHNXr1
JAXM為發(fā)送和接收SOAP消息提供一個標(biāo)準(zhǔn)的Java API。消息結(jié)構(gòu)和編碼規(guī)則是基于SOAP 1.1和SOAP with Attachment (SOAPATTACH)規(guī)范。JAXM還支持一個框架,高級的描述可以插入到該框架中,以支持基本SOAP上的擴(kuò)展語義。這些描述的例子有ebXML消息服務(wù)描述和SOAP RP描述。中國IT動力uMHNXr1
那么為什么使用JAXM呢?就像任何其他Java技術(shù)一樣,JAXM提供一個標(biāo)準(zhǔn)的Java API,所以應(yīng)用可以移植。JAXM還提供一個靈活的體系結(jié)構(gòu),在這種結(jié)構(gòu)中,提供商可以在維護(hù)你的應(yīng)用的可移植性的同時參加它們的實(shí)現(xiàn)。例如,我們后面將會講到,提供商可以實(shí)現(xiàn)帶有增加值特性(比如更高的可靠性或智能路由)的JAXM提供者。中國IT動力uMHNXr1
圖3顯示了JAXM(和就這點(diǎn)而論的JAX-RPC)的相互操作模型。前面已經(jīng)提到過,JAXM為發(fā)送和接收SOAP消息提供一個標(biāo)準(zhǔn)的Java API。只要基礎(chǔ)XML和傳輸協(xié)議是基于HTTP上的SOAP、JAXM或JAX-RPC,應(yīng)用就應(yīng)該可以與它們的對等體相互操作,而不管這些對等體是編寫為通過非-JAXM API或者是以Java以外的編程語言編寫的這一事實(shí)。中國IT動力uMHNXr1
中國IT動力uMHNXr1
圖3:JAXM相互操作模型中國IT動力uMHNXr1
JAXM結(jié)構(gòu)角色中國IT動力uMHNXr1
在JAXM運(yùn)行時環(huán)境中,可以有兩個結(jié)構(gòu)角色。一個是JAXM消息提供者(或者叫做JAXM提供者),另一個是JAXM客戶。而JAXM客戶又可以是兩種類型中的一種——一種使用JAXM提供者,另一種不使用JAXM提供者。(順便說一下,我們使用術(shù)語“JAXM客戶”是指JAXM API的一個用戶,而不是從傳統(tǒng)客戶和服務(wù)器通信模型的角度出發(fā)。例如,JAXM客戶可以提供可被其他客戶調(diào)用的SOAP服務(wù),或者該服務(wù)將從遠(yuǎn)程SOAP服務(wù)調(diào)用一個服務(wù)。所以把“JAXM客戶”叫做“JAXM應(yīng)用”更合適。但是既然JAXM規(guī)范使用術(shù)語“JAXM客戶”,我們也就使用它吧)。不使用JAXM提供者的JAXM客戶叫做獨(dú)立的JAXM客戶。中國IT動力uMHNXr1
JAXM消息提供者在后臺以JAXM客戶的名義工作,提供消息路由和可靠消息傳遞等功能,例如,通過分配消息標(biāo)識符或永久地在內(nèi)部保留著消息。事實(shí)上,不同的提供者提供的功能變化很大。JAXM提供者的服務(wù)是通信結(jié)構(gòu)的組成部分,而不是特定于某個應(yīng)用。因此,這些服務(wù)對JAXM客戶是完全透明的,JAXM客戶不了解提供者,除非建立了一個到該提供者的連接。中國IT動力uMHNXr1
正如前面所提到的,有兩種類型的JAXM客戶——一種使用JAXM消息提供者,另一種不使用JAXM消息提供者。既然解釋不使用JAXM消息提供者的JAXM客戶比較容易,那么我們就先來討論這種JAXM客戶。不使用JAXM消息提供者的JAXM客戶是一個獨(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客戶也只在同步模式中工作。也就是說,它基本上以請求-響應(yīng)交互模型工作,因而不能以異步模式接收消息。中國IT動力uMHNXr1
現(xiàn)在我們來討論使用JAXM消息提供者的JAXM客戶類型。在這種情況下,JAXM客戶維持著一個與JAXM消息提供者的連接,并且該客戶發(fā)送或接收的所有消息都通過該JAXM消息提供者。在大多數(shù)Web消息傳遞場景中,JAXM客戶將使用一個JAXM消息提供者。在這種場景中,JAXM客戶被部署到一個容器中,這意味著它既可以同步發(fā)送消息,也可以異步發(fā)送消息。容器可以是J2EE Web容器或者是EJB容器。如果JAXM客戶被部署在EJB容器中,那么很可能該JAXM客戶是消息驅(qū)動Bean的形式;如果它被部署在Web容器中,它就擴(kuò)展JAXMServlet類。中國IT動力uMHNXr1
JAXM消息傳遞描述中國IT動力uMHNXr1
JAXM的一個重要特性就是支持高級別的消息傳遞描述。通過為指定高級別的語義(比如安全性、可靠性、事務(wù)和管理)而規(guī)定SOAP頭的一個特定用法,消息傳遞描述運(yùn)行在基本SOAP上。 SOAP的基本形式不支持基于尋址或基于消息傳遞的會話方案,也就是說,基本的SOAP消息沒有任何用于尋址信息(比如發(fā)送者、接收者、消息ID和相關(guān)信息)的字段。描述在這一領(lǐng)域也有幫助。JAXM可以支持很多工業(yè)標(biāo)準(zhǔn)消息描述,一個主要的例子是ebXML消息服務(wù)描述。中國IT動力uMHNXr1
JAXM包中國IT動力uMHNXr1
圖4顯示了JAXM應(yīng)用及其使用的基礎(chǔ)Java應(yīng)用包的一個分層視圖。JAXM應(yīng)用可以使用三種不同層次的API。在最頂層有由高級別描述(比如ebXML消息傳遞服務(wù)描述)暴露的編程API。JAXM應(yīng)用也可以使用由JAXM消息傳遞包暴露的API或由JAXM SOAP包暴露的API。這些三層API集合中的每一層都提供不同的功能:描述API用于訪問和處理特定于描述的SOAP頭、JAXM消息傳遞API用于提供消息傳遞(例如,與JAXM消息提供者通信)的一個抽象和SOAP API用于創(chuàng)建及處理SOAP消息頭與消息體結(jié)構(gòu)。中國IT動力uMHNXr1
中國IT動力uMHNXr1
圖4:JAXM分層視圖中國IT動力uMHNXr1
JAXM部署中國IT動力uMHNXr1
JAXM應(yīng)用可以分別打包為Web應(yīng)用或J2EE平臺應(yīng)用,及部署到Servlet 2.2和/或J2EE 1.3容器中。可以預(yù)期到,J2EE規(guī)范(J2EE 1.4)的未來版本將會包含JAXM特定的部署信息。獨(dú)立的JAXM應(yīng)用只實(shí)現(xiàn)一種請求-響應(yīng)形式的消息傳遞,這種應(yīng)用可以被認(rèn)為是J2SE應(yīng)用,并且不會為這樣的應(yīng)用引入新的部署要求。中國IT動力uMHNXr1
JAX-RPC 中國IT動力uMHNXr1
JAX-RPC是JAXM、JAX-RPC和JAXR這三者之一。JAX-RPC處理SOAP消息傳遞的RPC部分?,F(xiàn)在我們來討論JAX-RPC的范圍。首先,它定義Java API和XML數(shù)據(jù)類型映射是如何完成的。例如,當(dāng)SOAP客戶調(diào)用SOAP服務(wù)提供者的一個方法時,方法的參數(shù)必須從Java對象映射到相應(yīng)的XML元素。而當(dāng)SOAP服務(wù)提供者接收到一個SOAP RPC請求消息時,則必須從XML元素映射到相應(yīng)的Java對象。JAX-RPC也定義WSDL文檔及其元素是如何映射到Java API表示的。例如,WSDL文檔的portType元素被映射到服務(wù)定義接口,這是定義在WSDL文檔中的服務(wù)的抽象部分的Java表示。JAX-RPC也定義運(yùn)行時API,其中包含stub接口、動態(tài)代理、動態(tài)調(diào)用,以及最終的編組和解組。Stub類一般由工具產(chǎn)生,并且必須實(shí)現(xiàn)Stub java接口。動態(tài)代理由JAX-RPC實(shí)現(xiàn)——JAX-RPC運(yùn)行時產(chǎn)生,并且它是服務(wù)定義接口的一個實(shí)現(xiàn)。動態(tài)調(diào)用允許客戶在運(yùn)行時設(shè)置目標(biāo)地址和屬性(比如用戶名和密碼)。中國IT動力uMHNXr1
JAX-RPC:XML數(shù)據(jù)類型到Java API的映射中國IT動力uMHNXr1
可以映射到Java API類型的XML數(shù)據(jù)類型包括簡單類型和復(fù)雜類型。簡單類型包含W3C XML 方案中定義的內(nèi)置的原始類型。例如,字符串?dāng)?shù)據(jù)類型被映射到j(luò)ava.lang.String類,而dateTime數(shù)據(jù)類型被映射到j(luò)ava.util.Calendar類。JAX-RPC規(guī)范地址指出的其他簡單類型包括數(shù)組和枚舉型。復(fù)雜類型的一個例子是結(jié)構(gòu)數(shù)據(jù)類型。結(jié)構(gòu)類型被映射到具有相應(yīng)getter和setter方法的JavaBeans組件。下面我們來看兩個例子。中國IT動力uMHNXr1
下面的例子顯示了枚舉數(shù)據(jù)類型是如何映射到相應(yīng)的Java類的。中國IT動力uMHNXr1
下載或使用該代碼,你就同意這些許可條款。中國IT動力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動力uMHNXr1
下面的例子顯示XML結(jié)構(gòu)數(shù)據(jù)類型如何以Java類來表示。正如前面所提到的,XML結(jié)構(gòu)類型可以由JavaBean類來表示,該類具有針對結(jié)構(gòu)的每個成員的getter和setter方法。中國IT動力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動力uMHNXr1
JAX-RPC:WSDL到Java API的映射中國IT動力uMHNXr1
JAX-RPC處理的另一個重要領(lǐng)域是描述WSDL文檔及其元素是如何映射到相應(yīng)的Java表示的。JAX-RPC規(guī)范表明,每個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元素映射到一個Java接口類型,portType元素是operation元素的集合。該Java接口類型被作為服務(wù)定義接口來調(diào)用。該服務(wù)定義接口擴(kuò)展ava.rmi.Remote。operation元素被映射到服務(wù)定義接口的一個方法,而message元素被映射到該方法的參數(shù)。因此,讓我們來看一個例子。中國IT動力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動力uMHNXr1
在上面的例子中,第一部分包含例子WSDL文檔的抽象部分,該例子文檔定義了portType、operation和message元素。(在WSDL文檔中,portType、operation和message元素定義了服務(wù)的抽象部分。portType是operation的集合。Operation是一個動作,在該動作中,進(jìn)行輸入/輸出消息的交換以完成動作)。例子的底部是Java API表示。在該例子中,portType的名稱StockQuoteProvider以紅色高亮顯示,并被用作服務(wù)定義接口的名稱。Operation的名稱GetLastTradePrice以蘭色高亮顯示,并被轉(zhuǎn)換為相同名稱的方法。請注意,服務(wù)定義接口擴(kuò)展java.rmi.Remote類型,并且每個方法都拋出java.rmi.RemoteException。另外,服務(wù)定義接口只表示W(wǎng)SDL文檔的抽象部分,也就是說,它不涉及服務(wù)是如何綁定到特定的XML或傳輸協(xié)議的。中國IT動力uMHNXr1
WSDL文檔中的service元素表示一個端口總集,其中每個端口都定義了特定的綁定。也就是說,有了binding和port元素,service元素將portType元素的抽象定義與具體的XML和傳輸協(xié)議及它們的端點(diǎn)地址綁定在一起;例如,HTTP上的SOAP作為具體的XML和傳輸協(xié)議,而特定的URL作為端點(diǎn)地址。中國IT動力uMHNXr1
在JAX-RPC之下,service元素被映射到j(luò)avax.xml.rpc.Service接口類型。javax.xml.rpc.Service類充當(dāng)下面這些東西的工廠:中國IT動力uMHNXr1
- 服務(wù)端口的動態(tài)代理。
- 類型javax.xml.rpc.Call的實(shí)例,該類型用于服務(wù)端口上的遠(yuǎn)程操作的動態(tài)調(diào)用。
- 產(chǎn)生的stub類的實(shí)例。
因此,前一個例子只處理WSDL文檔的抽象部分,與此相反,WSDL文檔的service元素被轉(zhuǎn)換為javax.xml.rpc.Service類,該類指定了該服務(wù)將如何被調(diào)用。中國IT動力uMHNXr1
下一代碼段顯示了例子WSDL文檔的具體綁定部分。在該例子中,叫做StockQuotePortType的portType被綁定到SOAP,SOAP可以支持文檔樣式或RPC樣式。文檔樣式是可以選擇的。最后,該服務(wù)通過一個通信端點(diǎn)被暴露,該端點(diǎn)由一個為特定通信協(xié)議指定端點(diǎn)地址的port元素來表示。在該例子中,端點(diǎn)碰巧是URL形式,即http:///stockquote,因?yàn)橛糜趥鬏擲OAP消息的傳輸協(xié)議是HTTP。如果使用的傳輸協(xié)議是SMTP,那么端點(diǎn)將是郵件地址的形式。中國IT動力uMHNXr1
<binding name="StockQuoteSoapBinding" type="tns:StockQuotePortType"> <soap:binding style="document" transport="http://schemas./soap/http"/> <operation name="GetLastTradePrice"> <soap:operation soapAction="http:///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:///stockquote"/> </port> </service>中國IT動力uMHNXr1
下一代碼段是由JAX-RPC規(guī)范定義的javax.xml.rpc.Service Java接口類型。JAX-RPC 1.0實(shí)現(xiàn)是必需的,以提供給該接口一個實(shí)現(xiàn)類。也就是說,由平臺提供商負(fù)責(zé)實(shí)現(xiàn)該接口。該實(shí)現(xiàn)類是必需的,以支持動態(tài)代理和javax.xml.rpc.Call對象的創(chuàng)建。getPort方法為指定的服務(wù)端口返回動態(tài)代理。服務(wù)客戶使用該動態(tài)代理來調(diào)用目標(biāo)服務(wù)端口上的操作。proxyInterface指定所創(chuàng)建的動態(tài)代理支持的服務(wù)定義接口。中國IT動力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動力uMHNXr1
方法getPorts返回由該服務(wù)成組的端口的一列限定的名稱(像javax.xml.rpc.namespace.QName)。方法createCall的多個變體創(chuàng)建javax.xml.rpc.Call的實(shí)例。javax.xml.rpc.Call接口為目標(biāo)服務(wù)端口上的操作的動態(tài)調(diào)用提供支持??蛻舳薐AX-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名稱空間中的注冊。中國IT動力uMHNXr1
JAX-RPC:工具中國IT動力uMHNXr1
因?yàn)镴AX-RPC定義關(guān)于WSDL文檔如何映射到相應(yīng)Java表示的精確規(guī)則,所以映射過程最好使用工具自動完成。因此,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動力uMHNXr1
JAX-RPC:可擴(kuò)展的類型映射中國IT動力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動力uMHNXr1
JAX-RPC 1.0指定API以支持可擴(kuò)展類型映射框架。這些API允許可插入串行化器和反串行化器的部署,以支持任何Java API類型和XML數(shù)據(jù)類型之間的可擴(kuò)展映射。可插入的串行化器和反串行化器可以被打包作為JAX-RPC 1.0實(shí)現(xiàn)的一部分,或者可以由工具提供商、服務(wù)開發(fā)者和服務(wù)客戶來提供。中國IT動力uMHNXr1
使用不同的XML處理機(jī)制和表示,類型映射框架應(yīng)該允許可插入串行化器和反串行化器的部署。但是,JAX-RPC 1.0版本中并沒有解決跨各種JAX-RPC實(shí)現(xiàn)的可插入串行化器和反串行化器的可移植性。中國IT動力uMHNXr1
JAX-RPC包中國IT動力uMHNXr1
圖5顯示了各種包之間的關(guān)系。RPC包和消息傳遞包都將SOAP包用于創(chuàng)建、操縱和處理SOAP消息。并且RPC包用于RPC,而消息包用于消息傳遞。中國IT動力uMHNXr1
中國IT動力uMHNXr1
圖5:包關(guān)系中國IT動力uMHNXr1
JAXR 中國IT動力uMHNXr1
注冊中心的典型應(yīng)用是什么? 注冊中心的功能相當(dāng)于一個電子黃頁, 商業(yè)組織的信息和他們所提供的服務(wù)和產(chǎn)品可以在這里發(fā)布和發(fā)現(xiàn)。注冊中心也可以當(dāng)作數(shù)據(jù)庫,或者共享信息存儲庫。共享的信息可以是任何東西。注冊中心也可以看作電子公告板, 合作伙伴就可以以一種動態(tài)的、臨時的方式共享信息。注冊服務(wù)的典型操作是什么呢?首先,提交和保存共享信息是比較重要的注冊操作。我們還需要完成各種注冊管理操作,比如標(biāo)識、命名、描述、分類、關(guān)聯(lián)、分組和標(biāo)注。最后,我們還必須能夠從注冊中心完成查詢、發(fā)現(xiàn)和獲取共享的信息等操作。所以任何注冊中心的編程API都需要支持這些操作。JAXR (Java API for XML Registry) 為在不同的注冊服務(wù)提供者之間進(jìn)行以上注冊操縱提供了一套標(biāo)準(zhǔn)的Java API。同時它也為描述注冊內(nèi)容定義了一個統(tǒng)一的信息模型。所以不用考慮要訪問的注冊服務(wù)提供者,你的程序可以對通用的信息模型進(jìn)行操作。由于注冊提供者性能上的多樣性,JAXR設(shè)計組決定通過性能描述來提供多層API抽象。中國IT動力uMHNXr1
JAXR將成為J2EE(J2EE 1.4)的一部分,而J2EE 1.4將會成為Web服務(wù)開發(fā)和部署的首選平臺。這就意味著J2EE 1.4平臺的開發(fā)商們?yōu)榱伺c1.4的標(biāo)準(zhǔn)兼容必須提供JAXR服務(wù)(雖然不一定要是注冊服務(wù))。中國IT動力uMHNXr1
JAXR: 性能描述中國IT動力uMHNXr1
在JAXR中,相關(guān)的注冊服務(wù)特性被分組成一個性能級別。每個性能級別用一個java 接口來體現(xiàn),而每個相同性能級別中的特性對應(yīng)于此java接口中的一個方法. 為了便于測試兼容性,減少交互協(xié)作中出現(xiàn)的問題,JAXR把性能劃分成較小單位的性能描述集合. 一個性能描述定義了一類性能的集合(Java接口類型的集合),這些java接口類型的集合必須被整體所支持以符合該性能描述的要求. 目前,JAXR只定義了兩個性能描述,基本特性的0級層和高級特性的1級層。最低限度下,所有的JAXR提供者必須實(shí)現(xiàn)0級架構(gòu)。同時為了便于發(fā)現(xiàn)性能,JAXR還定義了一個發(fā)現(xiàn)接口,允許客戶端訪問和發(fā)現(xiàn)注冊服務(wù)的性能.中國IT動力uMHNXr1
圖6說明了不同的JAXR客戶端上如何利用JAXR API與不同的注冊中心進(jìn)行交互操作的。在結(jié)構(gòu)上,JAXR客戶端利用API執(zhí)行注冊操作,而JAXR提供者實(shí)現(xiàn)這個API的功能。由于JAXR提供了一個標(biāo)準(zhǔn)的API來訪問不同的注冊提供者和描述注冊內(nèi)容的統(tǒng)一信息模型,無論是HTML瀏覽器、J2EE組件(如servlet 或者EJB beans)或獨(dú)立的J2SE應(yīng)用程序的JAXR客戶端,都能夠統(tǒng)一地對不同的注冊提供者執(zhí)行注冊操作。中國IT動力uMHNXr1
中國IT動力uMHNXr1
圖6:客戶端與注冊中心的互操作性 中國IT動力uMHNXr1
圖7是JAXR架構(gòu)的描述,底部是現(xiàn)有的注冊服務(wù)提供者,如ebXML, reg/rep, UDDI和其他類型. 這些注冊服務(wù)提供者可以被特定注冊服務(wù)的JAXR提供者訪問。只要被注冊服務(wù)提供者確認(rèn),特定注冊服務(wù)的JAXR提供者就可以成為他們的客戶端。從這個意義上講,特定注冊服務(wù)的JAXR提供者相當(dāng)于是JAXR客戶端的代理。這種可插拔的JAXR提供者實(shí)現(xiàn)了獨(dú)立于注冊服務(wù)類型的JAXR API的特性。可插拔的提供者為多樣化的特定注冊服務(wù)的JAXR提供者定義了單一的抽象。所以客戶端在訪問實(shí)際注冊服務(wù)的時候可以不考慮特定注冊服務(wù)的JAXR提供者的多樣性。這些是與特定性能相關(guān)的接口。中國IT動力uMHNXr1
中國IT動力uMHNXr1
圖07: JAXR 架構(gòu) 中國IT動力uMHNXr1
總結(jié)中國IT動力uMHNXr1
正如此文所述,Java技術(shù)組通過堅持不懈地努力,為Web服務(wù)提供了一套非常全面的API。這套Java API包括基于XML的消息傳送(JAXM),基于XML的遠(yuǎn)程過程調(diào)用(JAX-RPC),基于XML的注冊服務(wù)操作(JAXR),為應(yīng)用于Web 服務(wù)的全面完整的Java API的必然出現(xiàn)奠定了堅實(shí)基礎(chǔ)。中國IT動力uMHNXr1 |