用于 Java 2 平臺(tái)袖珍版 (Java 2 Platform, Micro Edition,J2ME) 的 Web 服務(wù) API (WSA) 是由Java Community Process為 Java 規(guī)范請(qǐng)求 172 (JSR 172) 而定義的,這些 API 是兩個(gè)相互獨(dú)立的可選包,用于遠(yuǎn)程服務(wù)調(diào)用和 XML 解析。他們是針對(duì)基于連接設(shè)備配置 (Connected Device Configuration,CDC) 和有限連接設(shè)備配置 (Connected Limited Device Configuration,CLDC 1.0 和 CLDC 1.1) 的框架的。為什么用戶應(yīng)該關(guān)注這些呢?因?yàn)?JSR 172 在設(shè)備層為遠(yuǎn)程服務(wù)調(diào)用和 XML 解析提供了支持,也就意味著開發(fā)人員不用將這項(xiàng)功能嵌入到每一個(gè)應(yīng)用程序中。本文介紹了遠(yuǎn)程服務(wù)調(diào)用可選包 API。【JSR:java specification Request】【WSA:web service APIs】
J2ME 中的 Web 服務(wù)
Java 2 平臺(tái)袖珍版 (J2ME) 平臺(tái)中的 Web 服務(wù)是由 Java 規(guī)范請(qǐng)求 172 (JSR 172) 定義的,它與標(biāo)準(zhǔn) Web 服務(wù)遵循同樣的規(guī)范、結(jié)構(gòu)以及調(diào)用模型。我們來(lái)回顧一下清單。
與標(biāo)準(zhǔn) Web 服務(wù)的比較
JSR 172 Web 服務(wù) API (WSA) 遵循下面這些核心 Web 服務(wù)規(guī)范:
注意 JSR 172 不支持統(tǒng)一描述、發(fā)現(xiàn)和集成 (UDDI) 2.0規(guī)范,該規(guī)范定義了如何發(fā)現(xiàn)遠(yuǎn)程服務(wù)。
由于有相當(dāng)多的與 Web 服務(wù)相關(guān)并且涵蓋了不同技術(shù)的規(guī)范出臺(tái),而且越來(lái)越多,Web 服務(wù)互操作組織 (WS-I)定義了 WS-I 基本概要 1.0 (WS-I Basic Profile,Version 1.0) 來(lái)定義 Web 服務(wù)規(guī)范的最小集,和一致性規(guī)則一樣,所有的基礎(chǔ) Web 服務(wù)提供者和消費(fèi)者都必須遵守該概要。JSR 172 規(guī)范也遵守 WS-I 基本概要。
與標(biāo)準(zhǔn) Web 服務(wù)具有相同的體系結(jié)構(gòu):
JSR 172 WSA 從客戶端訪問(wèn) Web 服務(wù),從服務(wù)-消費(fèi)者的角度來(lái)看,WSA 提供遠(yuǎn)程服務(wù)調(diào)用 API (JAX-RPC) 以及運(yùn)行時(shí)環(huán)境,從而允許 J2ME 應(yīng)用程序在 Web 上消費(fèi)服務(wù),而不是作為服務(wù)生產(chǎn)者(端點(diǎn))來(lái)運(yùn)行。除了這一點(diǎn)差別之外,JSR 172 WSA 體系結(jié)構(gòu)的其它部分與 Web 服務(wù)的標(biāo)準(zhǔn)體系結(jié)構(gòu)/組織一致,如下圖所示:
該高級(jí)體系結(jié)構(gòu)組織如下:
調(diào)用模型和數(shù)據(jù)流與標(biāo)準(zhǔn) Web 服務(wù)相同:
J2ME 應(yīng)用程序通過(guò) JSR 172 存根和運(yùn)行時(shí)調(diào)用遠(yuǎn)程服務(wù),通常要通過(guò) HTTP 和 SOAP 來(lái)進(jìn)行傳輸。存根和運(yùn)行時(shí)將與遠(yuǎn)程服務(wù)調(diào)用相關(guān)的復(fù)雜部分都隱藏起來(lái)了,包括輸入值和返回值如何編碼并解碼,以及與服務(wù)器進(jìn)行網(wǎng)絡(luò)通信的管理。方法調(diào)用遵循同步請(qǐng)求-應(yīng)答模型,如下圖所示:
*由于調(diào)用是按模塊進(jìn)行的,所以您應(yīng)該把這些調(diào)用分派到不同的執(zhí)行線程中。
![]() ![]() |
![]() |
消費(fèi) Web 服務(wù)
要消費(fèi) Web 服務(wù),您必須首先創(chuàng)建服務(wù)調(diào)用存根。讓這些存根來(lái)執(zhí)行任務(wù),例如對(duì)輸入值和返回值進(jìn)行編碼和解碼、與 JSR 172 運(yùn)行時(shí)交互來(lái)調(diào)用遠(yuǎn)程服務(wù)端點(diǎn)。存根通過(guò)運(yùn)行時(shí)的服務(wù)提供者接口 (SPI) 與運(yùn)行時(shí)進(jìn)行交互,這樣通過(guò)概述運(yùn)行時(shí)執(zhí)行的詳細(xì)情況,使存根在不同廠商之間的執(zhí)行更便捷。
從我們移動(dòng)開發(fā)的角度來(lái)看,需要消費(fèi)的 WSDL 文檔通常已經(jīng)存在,您需要做的僅僅是生成 JSR 172 WSA 存根。要生成這些存根,您應(yīng)該使用例如J2ME Wireless Toolkit 2.1存根生成器這樣的工具,如下圖所示:
該生成器生成存根 Java 文件,以及相關(guān)的支持類。如下一部分所描述的,它還考慮到了 WSDL 到 Java 的數(shù)據(jù)類型映射。
一旦生成了 JSR 172 JAX-RPC 存根和支持文件,您的應(yīng)用程序就已經(jīng)被編譯并部署到啟用了 JSR 172 的設(shè)備上了,消費(fèi) Web 服務(wù)是很簡(jiǎn)單的而且?guī)缀跏峭该鞯?。您很快就?huì)看到,調(diào)用遠(yuǎn)程方法幾乎和調(diào)用本地方法一樣簡(jiǎn)單。
![]() ![]() |
![]() |
JSR 172 JAX-RPC 子集 API
JSR 172 遠(yuǎn)程方法調(diào)用 API 是以基于 XML 的 RPC 的 J2SE Java API (JAX-RPC 1.1) 的子集為基礎(chǔ)的。它同樣遵守 WS-I 基本概要。下面來(lái)詳細(xì)研究一下 JSR 172 JAX-RPC 子集 API:
它支持:
xsd:boolean
到 boolean
或 Boolean
。 xsd:byte
到 byte
或 Byte
。 xsd:short
到 short
或 Short
。 xsd:int
到 int
或 Integer
。 xsd:long
到 long
或 Long
。 xsd:float
到 float
,或 Float
。對(duì)基于 CLDC 1.0 的平臺(tái),該數(shù)據(jù)類型映射到 String。 xsd:double
到 double
,或 Double
。對(duì)基于 CLDC 1.0 的平臺(tái),該數(shù)據(jù)類型映射到 String。 xsd:string
到 String
。 xsd:base64Binary
到 byte[]
。 xsd:hexBinary
到 byte[]
。 xsd:complexType
到基本類型和類類型序列。 xsd:QName
到 javax.xml.namespace.QName
。 它不支持:
設(shè)備端沒(méi)有規(guī)定 XML 編碼方法。這樣做是通過(guò)允許執(zhí)行程序使用更有效的數(shù)據(jù)編碼方法來(lái)幫助減少網(wǎng)絡(luò)傳輸,例如在設(shè)備和無(wú)線網(wǎng)關(guān)間使用二進(jìn)制協(xié)議(只要這樣編碼對(duì)消費(fèi)者和生產(chǎn)者是透明的)。
JSR 172 遠(yuǎn)程調(diào)用 API 包括下面這些包:
javax.microedition.xml.rpc
javax.xml.namespace
javax.xml.rpc
java.rmi
(包括確保 JAX-RPC 相關(guān)型) 注意這些 API(有一些異常 API,例如 RemoteException)不是直接由應(yīng)用程序調(diào)用,相反,應(yīng)用程序調(diào)用生成的存根。上面的 API 主要是供存根使用的。有關(guān)詳細(xì)信息請(qǐng)參閱 JSR 172 規(guī)范和/或 Java 文檔。
![]() ![]() |
![]() |
使用 JSR 172 JAX-RPC 調(diào)用遠(yuǎn)程服務(wù)
一旦生成、編譯并部署了 JSR 172 JAX-RPC 存根和支持文件,消費(fèi)遠(yuǎn)程服務(wù)就很容易了。事實(shí)上,除了導(dǎo)入 RemoteException,完成最少量的 JAX-RPC 細(xì)節(jié)初始化工作,您的應(yīng)用程序不光是看上去,而且運(yùn)行起來(lái)也和非 Web 服務(wù)消費(fèi)者應(yīng)用程序一樣。由于有 JSR 172 存根和運(yùn)行時(shí),實(shí)現(xiàn)這種簡(jiǎn)單的應(yīng)用程序是可能的,正如前面提到的,JSR 172 存根和運(yùn)行時(shí)把與遠(yuǎn)程調(diào)用相關(guān)的大部分細(xì)節(jié)都隱藏了。
要調(diào)用遠(yuǎn)程服務(wù),您首先需要實(shí)例化存根,完成最少的存根初始化工作,然后就是如何編寫調(diào)用存根方法。下面的代碼片斷顯示了如何使用 JSR 172 JAX-RPC 調(diào)用遠(yuǎn)程服務(wù)。
|
注意遠(yuǎn)程調(diào)用是如何在自己的執(zhí)行線程中執(zhí)行的。由于 JSR 172 中的遠(yuǎn)程調(diào)用是按模塊進(jìn)行的,而且如果在主事件線程中調(diào)用,用戶界面會(huì)凍結(jié),直到遠(yuǎn)程調(diào)用結(jié)束。
您已經(jīng)學(xué)習(xí)了 JSR 172 JAX-RPC 存根是如何生成的。以后,有關(guān)詳細(xì)信息請(qǐng)參考適當(dāng)?shù)拇娓善魑臋n。
![]() ![]() |
![]() |
結(jié)束語(yǔ)
本文介紹了用于 J2ME 平臺(tái)的 JSR 172 WSA,重點(diǎn)介紹了用于 J2ME 遠(yuǎn)程服務(wù)調(diào)用 API 的 JAX-RPC。另外,還涵蓋了 JSR 172 WSA 中用到的核心 Web 服務(wù)標(biāo)準(zhǔn)、典型結(jié)構(gòu)以及調(diào)用模型。并用一個(gè)簡(jiǎn)短的代碼實(shí)例回顧了如何消費(fèi) Web 服務(wù),即 JAX-RPC 子集 API。
在本文的第 2 部分,我將討論 JSR 172 XML 解析 API。
![]() ![]() |
![]() |
參考資料
![]() ![]() |
![]() |
關(guān)于作者
![]() | ||
| ![]() | C. Enrique Ortiz 是一位軟件工程師,有 14 年多的工作經(jīng)驗(yàn),他最近擔(dān)任 Aligo 公司的移動(dòng)應(yīng)用程序主管、AGEA 公司無(wú)線副總裁,還是 IBM Pervasive 軟件,智能推理系統(tǒng)的一位軟件工程師。Enrique 與人合作設(shè)計(jì)了 Sun Microsystems 的移動(dòng) Java 開發(fā)人員認(rèn)證考試。他還與人合著了一本最早的關(guān)于 J2ME 的書??用于 J2ME 的移動(dòng)信息設(shè)備框架。Enrique 積極參與無(wú)線 Java 社區(qū)及各種 J2ME 專家組。您可以通過(guò)C. Enrique Ortiz與他聯(lián)系。 |
聯(lián)系客服