国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
J2ME Web 服務(wù)入門
J2ME Web 服務(wù)入門

簡(jiǎn)介

WSA 設(shè)計(jì)用于與 J2ME 配置文件協(xié)同工作,J2ME 配置文件要么基于 Connected Device Configuration (CDC),要么基于 Connected Limited Device Configuration (CLDC 1.0 或 CLDC 1.1)。遠(yuǎn)程調(diào)用 API 基于 J2SE 的 Java API for XML-Based RPC (JAX-RPC 1.1) 的一個(gè)完整子集,它包含了一些遠(yuǎn)程方法調(diào)用(Remote Method Invocation,RMI)類,以滿足 JAX-RPC 依賴。XML 解析 API 基于 Simple API for XML, v2 (SAX2)的一個(gè)完整子集。

WSA 的目標(biāo)是把對(duì) Web 服務(wù)調(diào)用和 XML 解析的基本支持集成到設(shè)備的運(yùn)行時(shí)環(huán)境,這樣開(kāi)發(fā)人員就不必在每個(gè)應(yīng)用程序中嵌入這樣的功能了——在像移動(dòng)電話和個(gè)人數(shù)字助理這樣資源有限的設(shè)備中,這算是一個(gè)特別浪費(fèi)資源的問(wèn)題。

核心規(guī)范

Web Services Interoperability Organization (WS-I) 促進(jìn)了定義 Web 服務(wù)的核心規(guī)范和應(yīng)用層協(xié)議,并且它們受 World Wide Web Consortium (W3C) 和 Organization for the Advancement of Structured Information Standards (OASIS) 的指導(dǎo)。4 個(gè)關(guān)鍵標(biāo)準(zhǔn)規(guī)定了如何創(chuàng)建、部署、發(fā)現(xiàn)以及如何使用 Web 服務(wù):

Web 服務(wù)標(biāo)準(zhǔn) 描述
Simple Object Access Protocol (SOAP) 1.1 定義了傳輸和數(shù)據(jù)編碼
Web Services Definition Language (WSDL) 1.1 定義了如何描述遠(yuǎn)程服務(wù)
Universal Description, Discovery, & Integration (UDDI) 2.0 定義了如何發(fā)現(xiàn)遠(yuǎn)程服務(wù)
Extensible Markup Language (XML) 1.0 和 XML Schema 定義了可擴(kuò)展標(biāo)記語(yǔ)言(Extensible Markup Language ,XML) 和 XML 模式(Schema)

這些主要規(guī)范往往非常廣泛,而且 Web 服務(wù)開(kāi)發(fā)人員已發(fā)現(xiàn)難以實(shí)現(xiàn)完全互操作性。為了解決標(biāo)準(zhǔn)解釋中存在的差異,WS-I 已定義了一組稱作 WS-I Basic Profile, version 1.0 的一致性規(guī)則。JSR 172 符合基本配置文件(Basic Profile)。

J2ME 平臺(tái)上的 Web 服務(wù)

JSR 172 規(guī)定了標(biāo)準(zhǔn)化客戶端技術(shù),允許 J2ME 應(yīng)用程序在典型 Web 服務(wù)架構(gòu)上使用遠(yuǎn)程服務(wù),如圖 1 所示:

圖 1  在典型 Web 服務(wù)架構(gòu)上的 J2ME Web 服務(wù)  

在高層,該 Web 服務(wù)架構(gòu)具有三個(gè)元素:

駐留在支持 WSA 無(wú)線設(shè)備上的網(wǎng)絡(luò)感知應(yīng)用程序。該應(yīng)用程序包括使用 JSR 172 運(yùn)行庫(kù)與網(wǎng)絡(luò)進(jìn)行通信的 JSR 172 存根。下文將會(huì)描述存根和運(yùn)行庫(kù)所扮演的角色。
無(wú)線網(wǎng)絡(luò)和 Internet 以及對(duì)應(yīng)的通信和數(shù)據(jù)編碼協(xié)議,包括二進(jìn)制協(xié)議、HTTP 以及 SOAP/XML.
Web 服務(wù)器,扮演服務(wù)提供者的角色,通常在一個(gè)或多個(gè)防火墻和代理網(wǎng)關(guān)后面。Web 服務(wù)器通常提供對(duì)專用網(wǎng)絡(luò)上后端應(yīng)用程序和服務(wù)器的訪問(wèn)。
WSA 的第一個(gè)版本只解決了 Web 服務(wù)的使用,不支持服務(wù)端點(diǎn)的創(chuàng)建和開(kāi)發(fā);J2ME 設(shè)備可以是服務(wù)用戶,但不可以是服務(wù)提供者。JSR 172 還沒(méi)有規(guī)定使用 UDDI 的服務(wù)發(fā)現(xiàn)的 API。

了解 JSR 172

首先考查如何組織典型的基于 JSR 172 的應(yīng)用程序,開(kāi)始了解 J2ME Web Services 是如何運(yùn)作的:

該應(yīng)用程序本身是一個(gè)基于移動(dòng)信息設(shè)備配置文件(Mobile Information Device Profile,MIDP)或個(gè)人基礎(chǔ)配置文件(Personal Basis Profile,PBP))的智能客戶機(jī),具有特定于業(yè)務(wù)的邏輯、用戶界面、持久性邏輯以及生命周期和應(yīng)用程序狀態(tài)管理。該應(yīng)用程序可以使用 JAXP 子集 API 來(lái)處理 XML 文檔。還可以使用 JAX-RPC 子集 API 來(lái)使用 Web 服務(wù),從而使用 JSR 172 存根和運(yùn)行庫(kù)。

在像手提電話這樣的設(shè)備中,應(yīng)用程序和 JSR 172 存根通常駐留在設(shè)備內(nèi)存中,而所有 JSR 172 元素連同基礎(chǔ)配置文件和配置一起嵌入到設(shè)備本身。

JSR 172 運(yùn)行庫(kù)和服務(wù)提供者接口


在 JSR 172 操作的中心是運(yùn)行庫(kù),帶有服務(wù)提供者接口,允許存根執(zhí)行所有與調(diào)用 RPC 服務(wù)端點(diǎn)有關(guān)的任務(wù):

設(shè)置特定于 RPC 調(diào)用的屬性。
描述 RPC 調(diào)用輸入和返回值。
編碼輸入值。
調(diào)用 RPC 服務(wù)端點(diǎn)。
對(duì)應(yīng)用程序解碼并為其返回服務(wù)端點(diǎn)所返回的全部值。
圖 3 描繪出了客戶機(jī)應(yīng)用程序、存根以及運(yùn)行庫(kù)三者之間的關(guān)系:

圖 3  JSR 172 運(yùn)行庫(kù)和 SPI  

雖然 JSR 172 運(yùn)行庫(kù)隱藏了像連接管理和數(shù)據(jù)編碼這樣的復(fù)雜性,但 SPI 從運(yùn)行庫(kù)實(shí)現(xiàn)細(xì)節(jié)分離出了存根,從而允許存根在供應(yīng)商實(shí)現(xiàn)之間的可移植性。

客戶機(jī)應(yīng)用程序不直接與運(yùn)行庫(kù)和 SPI 進(jìn)行交互;而是使用存根。運(yùn)行庫(kù)和 SPI 主要為打算開(kāi)發(fā) JSR 172 運(yùn)行庫(kù)和自動(dòng)化工具的第三方供應(yīng)商所關(guān)心,比如開(kāi)發(fā)人員用于生成存根的 WSDL 到 Java 映射工具。

由于應(yīng)用程序開(kāi)發(fā)人員不直接使用 SPI,因此本文不會(huì)較詳盡地介紹運(yùn)行庫(kù)和 SPI。如果想了解關(guān)于它們的更多信息,可以查閱 JSR 172 規(guī)范。

JSR 172 JAX-RPC 子集 API

正如前面所提到的,JSR 172 Web 服務(wù)遠(yuǎn)程調(diào)用 API 基于 J2SE 的 JAX-RPC 1.1 API 的一個(gè)完整子集。以下列表在高層描述了該子集。要了解詳細(xì)信息,請(qǐng)參閱 JSR 172 specification:

符合 WS-I Basic Profile。
支持 SOAP 1.1。
支持所有傳輸,比如 HTTP 1.1,它可以傳送 SOAP 消息,而且具有一個(gè)捆綁 SOAP 1.1 的已定義協(xié)議。
支持全套數(shù)據(jù)類型:邏輯型、字符型、短整型、整型、長(zhǎng)整型、浮點(diǎn)型、雙精度型、字符串型(String)、基本類型數(shù)組以及復(fù)雜類型(包括基本或復(fù)雜類型的結(jié)構(gòu))。  
  
注意,真正的浮點(diǎn)支持只在基于 CDC 或基于 CLDC 1.1. On CLDC 1.0 的軟件堆棧中出現(xiàn),浮點(diǎn)型和雙精度型映射為 String。還要注意,所支持的數(shù)據(jù)類型會(huì)約束所支持的 WSDL 數(shù)據(jù)類型。后面的部分將討論 WSDL 到 Java 數(shù)據(jù)類型映射。  



支持表示 RPC 調(diào)用或響應(yīng)(使用 Document/Literal 消息傳遞模式的 WSDL 操作)的 SOAP 消息的 Literal 表示;不支持 Encoded 表示。
不支持帶有附件的 SOAP 消息。
不支持 SOAP 消息處理程序。
不支持服務(wù)端點(diǎn);即不允許設(shè)備是 Web 服務(wù)提供者。
不提供發(fā)現(xiàn)支持(UDDI).
要減少對(duì)網(wǎng)絡(luò)帶寬的需求——以及要節(jié)省用戶的時(shí)間和每字節(jié)的開(kāi)銷,請(qǐng)不要在設(shè)備本身上強(qiáng)制使用 XML 編碼。  
  
注:實(shí)現(xiàn)可能會(huì)使用更高效的編碼,比如設(shè)備與無(wú)線網(wǎng)關(guān)間的二進(jìn)制協(xié)議,只要它對(duì)消費(fèi)者和生產(chǎn)者來(lái)說(shuō)都是透明的。  



下表描述了 JSR 172 JAX-RPC 子集中的軟件包:

Java\ 軟件包 描述
javax.microedition.xml.rpc 定義了存根使用的 Type,它是合法簡(jiǎn)單類型的枚舉:邏輯型、字節(jié)型、短整型、整型、長(zhǎng)整型、浮點(diǎn)型、雙精度型、 String
定義了存根使用的 ComplexType,它是表示 WSDL xsd:complextype 定義的特殊類型
定義了存根使用的 Element,它表示 WSDL xsd:element 定義
定義了存根使用的 Operation,它表示服務(wù)端點(diǎn)的 WSDL wsdl:operation  
定義了 FaultDetailHandler,這是一個(gè)處理自定義故障的存根所實(shí)現(xiàn)的接口
定義了存根使用的 FaultDetailException,這是一個(gè) Exception 類,表示運(yùn)行時(shí)實(shí)現(xiàn)拋出的作為 JAXRPCException 結(jié)果的異常;為 service-specificDefines 返回存根異常詳細(xì)值所使用的 QName(限定名)類,并將相關(guān)的 QName 返回給 Stub 實(shí)例
javax.xml.namespace 定義了存根所使用的 QName(限定名)類
javax.xml.rpc 定義了 Stub 接口,這是所有 JAX-RPC 存根的基本接口;還定義了 NamespaceConstants 以及與 JAXRPCException 有關(guān)的類
java.rmi 標(biāo)準(zhǔn) java.rmi 軟件包子集,包含它以滿足 JAX-RPC 依賴性;只定義了 Remote 處理程序和三個(gè)異常類:MarshalException、 RemoteException 和 ServerException



除了像 RemoteException 這樣的異常,存根還使用大多數(shù)上述 API;應(yīng)用程序本身使用存根。

在應(yīng)用程序中使用 JAX-RPC 子集

創(chuàng)建 JSR 172 JAX-RPC 客戶機(jī)的一般步驟如下:

從描述遠(yuǎn)程 Web 服務(wù)的 WSDL XML 文檔生成 JSR 172 JAX-RPC 存根類。
在自己的代碼中創(chuàng)建生成存根的實(shí)例。
實(shí)例化之后,調(diào)用生成存根的方法。這些方法與 WSDL XML 文檔中服務(wù)端點(diǎn)的 wsdl:操作相對(duì)應(yīng)。
生成 JSR 172 JAX-RPC 存根

客戶機(jī)應(yīng)用程序通過(guò)存根和設(shè)備的 JSR 172 運(yùn)行庫(kù)與遠(yuǎn)程服務(wù)進(jìn)行交互。該運(yùn)行庫(kù)隱藏了與連接、SOAP 以及數(shù)據(jù)編碼管理相關(guān)的復(fù)雜性。

要與運(yùn)行庫(kù)進(jìn)行交互,客戶機(jī)通常使用存根生成器所生成的存根或者 WSDL 到 Java 的映射工具,它們用于在 WSDL 文檔中輸入遠(yuǎn)程服務(wù)接口定義,并生成使用 JAX-RPC 子集 API 和運(yùn)行庫(kù) SPI 的存根類。雖然也能手工開(kāi)發(fā)這些存根,但使用該生成器效果會(huì)更佳。下圖概述了存根的生成:

生成 JSR 172 存根的一般步驟。 最后所得到的存根類實(shí)現(xiàn)了 Stub Interface 和服務(wù)的遠(yuǎn)程接口,并使用了支持類。

生成 JSR 172 JAX-RPC 存根的步驟類似于創(chuàng)建基于 RMI 的應(yīng)用程序的步驟。在標(biāo)準(zhǔn) RMI 中,RMI 編譯器 (rmic) 從遠(yuǎn)程接口定義生成存根。如圖 4 所示,創(chuàng)建 WSA 應(yīng)用程序之后,WSDL 到 Java 的映射工具從 WSDL XML 文件生成存根。映射工具生成遠(yuǎn)程接口 Java 文件和支持類,它們由生成的存根本身所使用。然后將 JSR 172 存根編譯為 Java 類,并同應(yīng)用程序一起打包。

Sun 的 J2ME Wireless Toolkit V2.1 包含 JSR 172 JAX-RPC 存根生成器——本文稍后將講述如何使用它。第三方供應(yīng)商提供了自己的存根生成器。

使用 JSR 172 JAX-RPC 存根

存根一旦生成了,應(yīng)用程序就可以使用它了。以下代碼片段使用了稱作 PubService 的服務(wù),以便檢索無(wú)線技術(shù)文章:

package j2medeveloper.pubwebservice

// MIDP

import javax.microedition.midlet.MIDlet;

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Form;

...

// JAX-RPC

import java.rmi.RemoteException;

// JAX-RPC

String serviceURL = "www.j2medeveloper.com/pubwebservice";

String articleID = "IntroJSR172";

...

// Instantiate the service stub.

PubService_Stub service = new PubService_Stub();

// Set up the stub.

service._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, serviceURL);

service._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, new Boolean(true));

...

try {

    // Invoke the PubService method getArticleByID() to retrieve

    // a specific article by ID. A WirelessArticle represents an

    // article and has methods to get the article's author, date,

    // title, summary, and body. PubService also has a method to

    // get the PubService's RSS feed.

    WirelessArticle article = service.getArticleByID(articleID);

    // Create a Form to display the article.

    javax.microedition.lcdui.Form form =

        new Form(article.getShortTitle());

    form.append(wrap(article.getSummary()));

    ...

    ...

    display.setCurrent(form);

} catch (RemoteException e) {

    // Handle RMI exception.

} catch (Exception e) {

    // Handle exception.

}

...


使用存根會(huì)使遠(yuǎn)程服務(wù)調(diào)用變得非常容易。該代碼用例子說(shuō)明了 PubService_Stub,初始化了實(shí)例,并調(diào)用了它的其中一個(gè)方法 getArticleByID(),以便對(duì)文章本身進(jìn)行檢索。然后,應(yīng)用程序使用了文章的訪問(wèn)方法來(lái)獲取文章的標(biāo)題、摘要等等。

注意,因?yàn)檎{(diào)用 PubService_Stub.getArticleByID() 是分塊調(diào)用,因此在實(shí)際應(yīng)用程序中,要用分離的線程來(lái)分派該調(diào)用。在 WSA 中,方法調(diào)用遵循常見(jiàn)的客戶機(jī)/服務(wù)器交互的同步請(qǐng)求-響應(yīng)模型:客戶機(jī)向服務(wù)器發(fā)出請(qǐng)求,然后等待服務(wù)器的響應(yīng):

圖 5  同步請(qǐng)求/響應(yīng)模型

如何對(duì)方法及其參數(shù)進(jìn)行編碼、序列化和發(fā)送,以及如何接收、解碼和反序列化響應(yīng),對(duì)應(yīng)用程序來(lái)說(shuō)是完全透明的。JSR 172 存根和運(yùn)行庫(kù)處理所有這些單調(diào)冗長(zhǎng)的細(xì)節(jié)。

將 WSDL 數(shù)據(jù)類型映射到 Java

下面簡(jiǎn)要考察一下 JSR 172 的 JAX-RPC 子集 API 中的 WSDL 到 Java 的數(shù)據(jù)類型映射:

WSDL 數(shù)據(jù)類型 Java 數(shù)據(jù)類型

xsd:string  String
xsd:int int 或 Integer
xsd:long long 或 Long
xsd:short  short 或 Short
xsd:boolean  boolean 或 Boolean
xsd:byte  byte 或 Byte
xsd:float String、float 或 Float
xsd:double  String、double 或 Double
xsd:QName javax.xml.namespace.QName
xsd:base64Binary byte[]
xsd:hexBinary byte[]
Arrays 取決于 XML 數(shù)組的模式
xsd:complexType 基本和類類型的序列

別忘了,因?yàn)?CLDC 1.0 不支持浮點(diǎn)類型,因此一定要將浮點(diǎn)型和雙精度型映射為 String 型。當(dāng)目標(biāo)既包含 CLDC 1.0 又包含 CLDC 1.1 平臺(tái)時(shí),開(kāi)發(fā)人員應(yīng)使用該默認(rèn)映射。

要了解關(guān)于 WSDL 的更多信息,請(qǐng)參閱 JSR 172 specification 和 W3C's WSDL specification。

在應(yīng)用程序中使用 JAXP 子集

現(xiàn)在將注意力轉(zhuǎn)移到 JAXP 子集——其他 JSR 172 API。記得 JAXP 和 JAX-RPC 都是可選軟件包;它們彼此獨(dú)立地存在。

JAXP XML 解析 API 基于 Simple API for XML v2(SAX2)的一個(gè)完整子集。雖然標(biāo)準(zhǔn) SAX2 API 中的大多數(shù)類沒(méi)被包含在該子集中,但保留有所有必要的核心功能。

以下列表在高層描述了 JAXP 子集。要了解更多信息,請(qǐng)參閱 JSR 172 specification:

基于 SAX 2.0 的一個(gè)完整子集  不支持 SAX 1.0,因?yàn)?SAX 2.0 已將它取代了。

支持 XML 命名空間
既支持 UTF-8 又支持 UTF-16 字符編碼。
要么不支持文檔對(duì)象模型(Document Object Model (DOM))的 Level 1.0 ,要么不支持 DOM 的 Level 2.0 ,因?yàn)榭紤]到它太笨重。
不支持可擴(kuò)展樣式表語(yǔ)言轉(zhuǎn)換(Extensible Stylesheet Language Transformations,XSLT)。
支持文檔類型定義(Document Type Definition,DTD)。  
  
解析器可以根據(jù) XML 文檔類型的指定內(nèi)部或外部定義來(lái)對(duì)這些文檔進(jìn)行驗(yàn)證。 JSR 172 規(guī)定,文檔驗(yàn)證是可選的,因?yàn)樵摬僮鏖_(kāi)銷極大,一個(gè)文檔在限制較高的基于 CLDC 的環(huán)境不適合,但可能會(huì)在更高端的基于 CDC 的平臺(tái)上獲得成功。如果跳過(guò) DTD 處理,DefaultHandler.skippedEntity() 方法就會(huì)通知應(yīng)用程序。該邏輯符合 XML 1.0 規(guī)范。  



下表描述了 JSR 172 JAXP 子集中的軟件包:

Java 軟件包 描述
javax.xml.parsers 定義了 SAXParser,這是一個(gè)表示簡(jiǎn)單的基于 SAX 的解析器的 API。
定義了 SAXParserFactory,這是一個(gè)獲得和配置基于 SAX 的解析器的工廠。
定義了 ParserConfigurationException,拋出時(shí)指示配置錯(cuò)誤。
定義了 FactoryConfigurationError,拋出時(shí)指示解析器工廠的問(wèn)題。
org.xml.sax 定義了 Attributes,這是一個(gè)通過(guò)以下形式提供對(duì)屬性列表進(jìn)行訪問(wèn)的接口:
屬性索引
限定命名空間的名稱
限定(前綴)名稱

定義了 Locator,這是一個(gè)用于將 SAX 事件與文檔位置相關(guān)聯(lián)的接口。通過(guò)使用 Locator(該 Locator 通過(guò)調(diào)用 DefaultHandler 對(duì)象的 setDocumentLocator() 方法而指定)的實(shí)例,該應(yīng)用程序可以獲取解析事件位置信息,比如事件行號(hào)、列號(hào)以及公共和系統(tǒng)標(biāo)識(shí)符。
Locator 提供了獲取當(dāng)前文檔事件結(jié)束位置的行號(hào)、列號(hào)的方法以及獲取當(dāng)前文檔事件的公共和系統(tǒng)標(biāo)識(shí)符的方法。

定義了 InputSource,它封裝輸入源。它提供了獲取或設(shè)置字節(jié)流、字符集、編碼以及公共和系統(tǒng)標(biāo)識(shí)符的方法。
定義了通用 SAX 異常類、SAXException 以及三個(gè)子類: SAXNotRecognizedException、SAXNotSupportedException 和 SAXParseException
org.xml.sax.helpers 定義了 DefaultHandler,這是 SAX2 事件處理程序的基類。它提供了要擴(kuò)展的應(yīng)用程序的事件處理行為的缺省實(shí)現(xiàn)。應(yīng)用程序開(kāi)發(fā)人員只需覆蓋相關(guān)的方法,就可以設(shè)計(jì)解析行為。
在讀取 XML 流的時(shí)候,當(dāng)解析器與 XML 元素或?qū)傩园l(fā)生沖突時(shí),它就通過(guò)調(diào)用其中一個(gè) DefaultHandler 方法來(lái)通知確定事件的應(yīng)用程序;例如:

startDocument() 和 endDocument(),在 XML 文檔的開(kāi)頭和末尾
startElement() 和 endElement(),在 XML 元素的開(kāi)頭和末尾
characters(),當(dāng)在元素內(nèi)部發(fā)現(xiàn)字符數(shù)據(jù)時(shí)
skippedEntity(),當(dāng)跳過(guò)一個(gè)實(shí)體時(shí)
JSR 172 specification 描述了 DefaultHandler 方法的其余部分。


以下方法定義顯示了如何使用 JAXP 來(lái)解析從 PubService 檢索的 RSS 提要:

/**
* Invoke the service and parse the RSS feed.
*/
private void parseRSSfeed() {
  try {
    // Create a RSS parser handler
    parser = new RSSParserHandler();
    try {
      SAXParserFactory factory = SAXParserFactory.newInstance();
      saxParser = factory.newSAXParser();
    } catch (Exception e) {
      // Handle exception...
      return;
    }
    // Invoke the remote service method getRSSFeed to
    // retrieve the RSS feed for the Pub service
    // web site.

        String rssFeed = service.getRSSFeed();

        // Parse the RSS feed.
    byte[] rssFeedByteArray = rssFeed.getBytes("UTF-8");
    ByteArrayInputStream rssFeedByteArrayInputStream =
      new ByteArrayInputStream(rssFeedByteArray);

    saxParser.parse(rssFeedByteArrayInputStream, parser);
  } catch (RemoteException e) {
    // Handle RMI exception.
  } catch (Exception e) {
    // Handle exception.
  }
}

parseRSSfeed() 方法使用 PubService_Stub.getRSSFeed() 遠(yuǎn)程服務(wù)來(lái)檢索 PubService 的 RSS Content XML 文檔,然后將其傳遞到 JAXP RSS-feed XML 解析器。以下類定義顯示了如何實(shí)現(xiàn)負(fù)責(zé)解析 RSS 提要的處理程序:

/**
* RSS Parser handler class to parse the RSS feed from the
* server.
*/

class RSSParserHandler extends DefaultHandler {
    // Stack to keep track of document parsing.
    Stack stack;

        // Current document element.
    Object current;

    /** Start of document processing. */
    public void startDocument() {
        rssParsingComplete = false;
        title = link = description = null;
        stack = new Stack();
    }

    /** Process the new element. */
    public void startElement(
            String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        if ("item".equals(qName)) {
            title = link = description = null;
        }
        stack.push(qName);
    }

    /** Process the character data for current tag. */
    public void characters(
            char[] ch, int start, int length) {
        Object current = stack.peek();
        if ("title".equals(qName)) {
            title = new String(ch, start, length));
        } else if ("link".equals(qName)) {
            link = new String(ch, start, length));
        } else if ("description".equals(qName)) {
            description = new String(ch, start, length));
        }
    }

        /** Process the end element tag. */
    public void endElement(
            String uri, String localName, String qName) {
        stack.pop();
        if ("rss".equals(qName)) {
            rssParsingComplete = true;
        } else {
            // Do something with title, link, description, such
            // as displaying it to the user.
        }
    }
}


注意,startDocument()、startElement()、stopElement() 以及 characters() 方法的定義提供了 SAX2 XML 解析所需的最低功能。

支持 Web 服務(wù)的 J2ME 無(wú)線工具包

J2ME Wireless Toolkit v2.1 包含開(kāi)發(fā)充分利用 J2ME Web Service 的 MIDlet 所需的庫(kù)。該工具包還包含 JAX-RPC 存根生成器,可以從命令行或 KToolbar 菜單運(yùn)行它,如下圖所示:


圖 6  J2ME 無(wú)線工具包 2.1 實(shí)用程序和存根生成器

在 Utilities 屏幕上選擇 Stub Generator。在出現(xiàn)的對(duì)話框中,輸入描述要使用服務(wù)的輸入 WSDL 文檔的 URL、生成文件的輸出路徑以及用于已生成存根文件的軟件包名。相應(yīng)地選擇 CLDC 1.0 或 1.1。

J2ME 無(wú)線工具包的 v2.1 還包含一個(gè)示例應(yīng)用程序 JSR172Demo。

結(jié)束語(yǔ)

J2ME Web 服務(wù)規(guī)范(J2ME Web Services Specification)使 J2ME 平臺(tái)上的 Web 服務(wù)和 XML 解析編程接口標(biāo)準(zhǔn)化了。隨著 JAX-RPC 子集 API 的出現(xiàn),開(kāi)發(fā)人員可以使用 Java 編程語(yǔ)言和熟悉的 JAX-RPC API 來(lái)創(chuàng)建使用基于 XML 的遠(yuǎn)程服務(wù)的應(yīng)用程序。而不必處理 HTTP、SOAP 和數(shù)據(jù)轉(zhuǎn)換的底層細(xì)節(jié)。而且隨著 JAXP 子集 API 的引入,XML 解析目前已是 J2ME 平臺(tái)本身不可分割的一部分。J2ME Web Services API 消除了開(kāi)發(fā)人員在每個(gè)應(yīng)用程序中包含用于遠(yuǎn)程調(diào)用和 XML 解析代碼的需要。

這些功能強(qiáng)大的 API 允許移動(dòng)應(yīng)用程序更容易地訪問(wèn)基于 Web 的服務(wù),但是開(kāi)發(fā)人員千萬(wàn)別忘了 J2ME 設(shè)備提供的受限制的應(yīng)用程序環(huán)境。僅僅移植現(xiàn)有的基于 XML 的桌面或企業(yè)應(yīng)用程序不是開(kāi)發(fā) J2ME 平臺(tái)的 Web 服務(wù)客戶機(jī)的適當(dāng)方法。對(duì)設(shè)備處理能力、電池壽命、網(wǎng)絡(luò)帶寬以及安全性的適當(dāng)考慮也是不可缺少的。

更多信息

JSR 172: J2ME Web Services Specification
Web Services Interoperability Organization (WS-I)
World Wide Web Consortium (W3C)
Organization for the Advancement of Structured Information Standards (OASIS)
The Complexity of Developing Mobile Networked Data Services, J2ME Wireless Connection Wizard For Sun Java System Studio
W3C WSDL website
致謝

非常感謝 JSR 172 規(guī)范負(fù)責(zé)人 Jon Ellis 和 Mark Young 對(duì)本文的反饋。

http://gceclub.sun.com.cn/staticcontent/html/2004-05-20/j2me.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
IBM developerWorks 中國(guó) : Java Web 服務(wù)專題
WebService CXF學(xué)習(xí)(進(jìn)階篇2):JAX-WS講解
JDK6的新特性之十一:更簡(jiǎn)單,更強(qiáng)大的JAX-WS - Java天下社區(qū) - www.javatx.cn - J2SE綜合
JAX-WS2.0規(guī)范--第一章
Web Service
20101028星期四
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服