摘要:介紹了Java ME的Web服務規(guī)范,比較了該規(guī)范定義的可選包與kXML和kSOAP之間的不同,指出了JavaME的JAX-RPC與Java SE/EE平臺上的JAX-RPC 1.1之間的差異,并給出了這些差異給Java ME程序設計者帶來的影響,為開發(fā)者提供了一些有價值的參考。
關(guān)鍵詞:Java ME;Web服務;JSR 172;JAX-RPC
O引言
在有線網(wǎng)絡環(huán)境中,Web服務已經(jīng)成為實現(xiàn)企業(yè)業(yè)務系統(tǒng)之間協(xié)同工作的一種關(guān)鍵技術(shù),Web服務也使企業(yè)更容易實現(xiàn)和影響新的服務交付類型,以及更方便在企業(yè)合作伙伴、企業(yè)和客戶之間進行溝通。Web服務的下一步目標,就是在任何地點都可以使用無線移動設備訪問企業(yè)應用或數(shù)據(jù),也就是無線Web服務。目前,許多開源軟件已經(jīng)開始嘗試為無線Web服務提供支持,如NanoXML,TinyXML,kXML,kSOAP和kXML-RPC等。不過,由于使用這些軟件通常會增加無線移動設備客戶端應用的大小,并且其編程接口也不統(tǒng)一,所以它們并不是企業(yè)最佳的選擇。2004年3月,由JCP(Java Community Process)制定的、旨在為Java ME應用提供Web服務支持的JSR 172規(guī)范正式發(fā)布,它為企業(yè)尋求無線Web服務解決方案提供了一種新的選擇。借助Java手持設備,特別是Java手機的普及,它極有可能成為Java平臺上最佳的無線Web服務解決方案。本文對該規(guī)范進行了深入的分析,指出了它與企業(yè)已存在的有關(guān)標準或應用編程接口之間的不同之處,給出了一些建議,為Java ME平臺上的Web應用的開發(fā)提供參考。
1 Java ME的Web服務規(guī)范簡介
Java ME的Web服務規(guī)范,即JSR 172為Java ME應用增加了兩大功能:一是使其能夠訪問基于SOAP/XML的遠程Web服務;二是使其具有解析XML數(shù)據(jù)的能力。與這兩大功能對應的兩個可選包,即Web服務訪問可選包和XML解析可選包可以單獨或共同集成到Java ME設備的runtime(運行時環(huán)境)中。由此,開發(fā)者不必把這些功能包含到每一個使用它們的Java ME應用中,這對資源受限的設備如手機和PDA來說是非常必要的。Java ME目前包括兩大體系結(jié)構(gòu),CLDC體系和CDC體系,JSR 172的這兩個可選包可以在這兩大體系上工作。
1.1 Web服務訪問可選包
JSR 172中用于訪問遠程Web服務的API是JAX-RPC1.1(用于Java SE/EE平臺)的—個子集,這里稱之為Java ME的JAX-RPC。Java ME的JAX-RPC遵循如下核心Web服務規(guī)范:SOAP 1.1、WSDL 1.1、XML 1.0、XML Schema。不過它并不支持UDDI 2.0規(guī)范,因此利用它訪問Web服務的Java ME應用將無法在運行中動態(tài)地“發(fā)現(xiàn)\"Web服務。無論如何,Java ME的JAX-RI~符合WS-I基本概要1.0(WS-I Basic Profile1.0)。Java ME設備特別是基于CLDC的設備(比如手機)內(nèi)存資源有限,處理能力較弱,并且一般沒有一個確定的IP地址,JavaME的JAX-RPC目前只為Java ME設備提供消費Web服務的能力,而沒有提供創(chuàng)建和部署Web服務的能力。除此之外,其體系結(jié)構(gòu)遵循Web服務的標準結(jié)構(gòu),如圖1所示。
作為Web服務的消費者(使用者),客戶端包括Java ME應用程序,比如基于CLDC的MlDlet或基于CDC的Xlet,一個JAX-RPC Stub和相關(guān)支持類,以及JAX-RPC Runtime。
Java ME的JAX-RPC也遵循標準Web服務的調(diào)用模型和數(shù)據(jù)流。Java ME應用通過JAX-RPC Stub調(diào)用遠程服務。JAX-RPC Stub隱藏了與JAX-RPC Runtime交互以及數(shù)據(jù)編碼的復雜性。JAX-RPC Runtime負責管理遠程調(diào)用和網(wǎng)絡操作,調(diào)用過程遵循同步請求一響應模型,如圖2所示。
在Java ME應用中使用Web服務訪問可選包主要包括如下3個步驟:(1)使用相關(guān)工具從WSDL文檔產(chǎn)生一個JAx-RPCstub類;(2)在Java ME程序中創(chuàng)建—個該stub的實例;(3闕用該stub類的方法以訪問遠程Web服務。
1.2 XML解析可選包
JSR 172中用于解析XML的API是基于JAXP 1.2(用于Java SE/EE平臺)和SAX 2的一個子集,這里稱之為Java ME的JAXP。JSR 172規(guī)定XML解析器必須符合XML 1.0規(guī)范,但可以基于DTD確認也可以不確認。解析器須遵循XML 1.0規(guī)范中給出的確認或非確認規(guī)則。由于確認是一個代價高昂的操作,是否實現(xiàn)一個需要確認的解析器,由設備供應商根據(jù)其設備的內(nèi)存資源大小和處理能力強弱決定。另外,JSR 172要求XML解析器必須支持XML名字空間,UTF-8和UTF-16字符編碼,以及DTD,但對DOM和XSLT不作要求。Java ME的JAXP提供了解析XML文檔所需的全部功能。事實上,在解析XML文檔時,可能只需使用該JAXP的一部分功能。JavaME的JAXP的使用包含3個主要步驟:(1)編寫應用程序的事件處理器(handler);(2)創(chuàng)建一個SAX解析器實例;(3)解析輸入的XML文檔。
2 JSR 172的可選包與kXML和kSOAP的比較
在JSR 172推出之前,Java ME應用通常使用kXML和kSOAP類庫來解析XML數(shù)據(jù)和調(diào)用Web服務。JSR 172的出現(xiàn)并沒有讓kXML和kSOAP過時,原因是它們工作在較低層次,可以為開發(fā)者提供很大的靈活性。JSR 172的可選包與kXML和kSOAP主要有以下不同:
(1)XML解析模式不同。JSR 172中的XML解析可選包僅支持推式的SAX模式,而kXML支持推式的SAX、拉式的XMLPull,以及kDOM(輕量級的DOM)模式。由于SAX模式比較節(jié)省內(nèi)存空間,因此比較適合Java ME設備。
(2)Web服務訪問可選包以Java為中心,kSOAP以XML為中心。使用JSR 172的Web服務訪問可選包,SOAP RPC調(diào)用如同Java本地RMI RPC調(diào)用,使用Web服務是非常直接和幾乎透明的,不過開發(fā)者不能直接控制低層的SOAP消息。相反,kSOAP允許開發(fā)者窺探XML內(nèi)部結(jié)構(gòu),增加定制的頭/屬性,以及操縱任意結(jié)點。
(3)Web服務訪問可選包不支持擴充的類型映射,而kSOAP是支持的。因此kSOAP可以訪問低層的SOAP結(jié)構(gòu),而可選包不可以。
(4)Web服務訪問可選包支持Web服務網(wǎng)關(guān)(經(jīng)由SPI即服務提供者接口),從而可以優(yōu)化系統(tǒng)的運行效率(比如在設備和網(wǎng)關(guān)之間使用二進制編碼)。kSOAP直接訪問Web服務,但由于Java ME設備的計算能力有限,對SOAPXML消息的解析處理速度不是很高,因此與使用了Web服務網(wǎng)關(guān)的可選包相比,kSOAP的系統(tǒng)效率較低。
3 Java ME的JAX—RPC與JAX—RPC 1.1之間的差異及給開發(fā)者帶來的影響
WS-I基本概要1.0通過對Web服務中的技術(shù)如SOAP1.1、XML 1.0、XML Schema、WSDL 1.1,以及UDDI 2.0的標準化,盡量保證不同的Web服務的互操作。JSR 172要求JavaME的JAX-RPC必須符合WS-I基本概要1.0,因此,Java ME的JAX-RPC會忽略掉JAX-RPC 1.1中不符合WS-I基本概要1.0的部分。遵循WS-I基本概要1.0可以增大Java ME應用使用各種Web服務的機會,不過,當Java ME應用在使用沒有實現(xiàn)該概要的JAX-RPC 1.1 Web服務的時候,可能會遇到問題。
JAX-R1.1支持3種類型的調(diào)用:靜態(tài)stub,動態(tài)代理(Dynamic Proxy),以及動態(tài)調(diào)用接口DII(Dynamic InvocationInterface)。靜態(tài)stub缺乏靈活性,但代碼最簡潔;DII最靈活,但實現(xiàn)起來也最復雜。Java ME的JAX-RPC僅支持靜態(tài)stub,開發(fā)者可使用WSDL到Java的映射工具來產(chǎn)生stub。缺乏對動態(tài)代理和DII的支持對Java ME應用并沒有什么負面影響,在Java ME平臺上靜態(tài)stub工作得很好,惟一的不便之處是開發(fā)者必須提前產(chǎn)生這些stub。
JAX-RPC 1.1為Java應用提供了使用Web服務的能力,也提供了創(chuàng)建和部署Web服務的功能。Java ME的JAX-RPC目前只為Java ME設備提供使用Web服務的能力,開發(fā)者不能使用Java ME的JAX-RPC在Java ME設備上創(chuàng)建Web服務端點。
JAX-RPC 1.1指定了3種客戶應用交互模型:同步請求一響應雙向PRC、異步(非阻塞)請求一響應雙向PRC,以及單向PRC。Java ME的JAX-RPC僅支持同步請求一響應雙向PRC。缺乏對另外兩種交互模型的支持對Java ME應用并沒有多大影響,作為最流行的PRC交互模型,同步雙向PRC對Java ME應用來說已經(jīng)足夠。開發(fā)者需要記住的是,使用同步雙向PRC,請求發(fā)出之后Java ME應用會被阻塞,直到收到返回的響應或者拋出一個異常。為避免出現(xiàn)阻塞,開發(fā)者應該把RPC調(diào)用操作分派到一個單獨的線程中。
JAX-RPC 1.1指出了SOAP與Java之間數(shù)據(jù)類型的映射關(guān)系。由于硬件平臺的限制,Java ME的JAX-RPC并不支持JAX-RPC 1.1的所有的基本數(shù)據(jù)類型。比如,Java ME的JAX-RPC不支持類型java.math.BigDecimal。另外,如果設備采用CLDC 1.0配置層,浮點類型將被映射成String類型。類型映射限制可能會給開發(fā)者帶來很大麻煩,開發(fā)者需要適應不能使用某些常用數(shù)據(jù)類型(包括dateTime、date和time類型)的JavaME環(huán)境,也需要為Java ME應用創(chuàng)建專門的WSDL文件,因為包含有不支持類型的WSDL文件不能產(chǎn)生Java ME應用使用的stub。
JAX-RPC 1.1支持soapenc:Array類型的數(shù)組以及wsdl:arrayType屬性,而Java ME的JAX-RPC不支持它們。在JavaME的JAX-RPC中,當元素的maxOccurs屬性大于1或者為unbounded時,就產(chǎn)生一個數(shù)組。不管怎樣,在JAX-RPC 1.1和Java ME的JAX-P-uC中,Java數(shù)組元素類型都基于XML數(shù)組模式(schema)。由于不支持soapenc:Array和wsdl:arrayType,JavaME應用將不能消費使用它們描述的數(shù)組的Web服務。不過,由于WS-I概要不贊成使用soapenc:Array和wsdl:arrayType,所以它們對Java ME應用的影響很有限。
在對復雜類型的支持方面,JAX-RPC 1.1支持指定xsd:se-quence元素、xsd:all元素和xsd:simpleContent元素的xsd:com-plexType,并且同時支持xsd:attribute和xsd:attribute Group。JavaME的JAX-RPC僅支持指定xsd:sequence元素的xsd:complex-Type,并且不支持xsd:attribute、xsd:attributeGroup或xsd:any。因此,Java ME應用將不能消費那些包含有使用了它不支持的方法或?qū)傩悦枋龅膹碗s類型的Web服務。另外,JAX-RPC 1.1支持枚舉(enumeration)以及有約束的或使用了xsd:list的簡單類型,而Java ME的JAX-RPC不支持它們,這會導致Java ME應用不能消費使用了這些特性的Web服務。
JAX-RPC 1.1支持Java類型和XML類型之間的擴充類型映射和序列化,而Java ME的JAX-RPC不支持擴充類型映射,這意味著開發(fā)者不能自己定義Java到XML的序列化。由于擴充類型映射的定義松散,不同的供應商對它的實現(xiàn)方法也不同,加之大多數(shù)Web服務并不使用它,所以Java ME應用開發(fā)者可以不理會它。
WSDL到Java映射方面,JAX-RPC 1.1支持wsdl:portType中的wsdl:operations名字重載,規(guī)定parameterOrder屬性必須反映出PRC方法的參數(shù)順序。遵循WS-I基本概要,Java ME的JAX-RPC規(guī)定wsdl:portType中的wsdl:operations的名字必須惟一,規(guī)定消息的各組成部分的順序,而不是parameterOrder屬性必須與PRC方法參數(shù)的順序一致。由此,Java ME應用將不能消費那些重載wsdl:portType中的操作名的Web服務,不過,因為符合WS-I基本概要已經(jīng)變得很盛行,操作名重載問題和參數(shù)順序問題將會越來越少見。
JAX-RPC 1.1支持SOAP消息處理器(handler),開發(fā)者可以利用它實現(xiàn)附加的SOAP消息處理,比如加密消息或者緩存消息。Java ME的JAX-RPC不支持SOAP消息處理器,因此,Java ME應用不能在處理SOAP消息時實現(xiàn)一些高級特征。
JAX-RPC 1.1支持包含有以MIME格式編碼的附件(attachment)的SOAP消息,Java ME的JAX-RPC不支持此類SOAP消息,由此帶來的后果是Java ME的Web應用不能發(fā)送和接收復雜的參數(shù)值和返回值,比如圖像或XML文檔。
JAX-RPC 1.1支持RPC和文檔(document)樣式的操作,支持編碼的(encoded)和文字的(1iteral)SOAP消息編碼,而Java ME的JAX-RPC僅支持文檔樣式的操作和文字的SOAP消息編碼。因此,Java ME應用將不能與依賴RPC和編碼樣式的Web服務相互操作。值得慶幸的是,為符合WS-I基本概要的要求,目前Web服務正在拋棄RPC/編碼樣式SOAP通信,轉(zhuǎn)向文檔/文字樣式SOAP通信。
在JAX-RPC 1.1中,SOAP fault或者被映射到javax.xml.rpc.soap.SOAPFaultException,或者被映射到—個服務特有的異常類,或者被映射到RemoteException。而Java ME的JAX-RPC不支持SOAPFaultException,SOAP fault要么被映射到一個服務特有的Java異常類,要么被映射到RemoteException。為避免這些差異帶來的影響,開發(fā)者應該在調(diào)用Web服務的時候,在catch語句塊中使用RemoteException。
4結(jié)束語
JSR 172可選包為Java ME應用提供了訪問遠程Web服務和解析XML數(shù)據(jù)的能力。作為Java ME平臺上專用的可選包,它們?yōu)槠髽I(yè)尋求無線Web服務解決方案提供了一種新的選擇,具有廣闊的應用前景。開發(fā)者必須記住,這些可選包是專為資源受限的Java ME設備設計的,它們與企業(yè)已存在的有關(guān)標準或API之間有許多不同之處。只有充分了解這些不同,才可以為Java ME設備編寫出有效的Web服務應用。
(注:本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文。)