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

打開APP
userphoto
未登錄

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

開通VIP
J2ME 的 Web 服務(wù) API講解
用于 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ī)范:

  • 簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議 (SOAP) 1.1,定義傳輸和數(shù)據(jù)編碼。
  • Web 服務(wù)定義語(yǔ)言 (WSDL) 1.1,定義如何描述遠(yuǎn)程服務(wù)。
  • XML 1.0,定義 XML 標(biāo)記語(yǔ)言。
  • XML Schema,毫無(wú)疑問(wèn),定義 XML 模式。

注意 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)/組織一致,如下圖所示:


圖 1 - WSA 高級(jí)體系結(jié)構(gòu)

該高級(jí)體系結(jié)構(gòu)組織如下:

  • 客戶端,Web 服務(wù)消費(fèi)者:它是 J2ME 應(yīng)用程序,例如 MIDP 或個(gè)人版基于框架的應(yīng)用程序,JSR 172 存根和支持類,以及 JSR 172 運(yùn)行時(shí)。
  • 網(wǎng)絡(luò):指的是無(wú)線和有線網(wǎng)絡(luò)以及通信協(xié)議,無(wú)線和有線網(wǎng)絡(luò)是 Internet 的一部分。注意 JSR 172 本身沒(méi)有規(guī)定在設(shè)備上使用 XML 編碼方法,而允許執(zhí)行程序(只要它們對(duì)消費(fèi)者和生產(chǎn)者是透明的)使用更有效的編碼方法,例如在設(shè)備和無(wú)線網(wǎng)關(guān)之間使用二進(jìn)制協(xié)議。
  • 服務(wù)器,Web 服務(wù)生產(chǎn)者:它是一個(gè) Web 服務(wù)器,通常位于防火墻和/或代理網(wǎng)關(guān)的后面。該服務(wù)器可以訪問(wèn)后臺(tái)資源。

調(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)答模型,如下圖所示:


圖 2 - JSR 172 調(diào)用模型

*由于調(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í)行更便捷。

存根通常是用工具生成的,該工具讀取一個(gè) WSDL XML 文檔,文檔描述了將要使用到的 Web 服務(wù)。同樣的,WSDL 文檔通常也是通過(guò)工具生成的,該工具讀取接口定義,例如 Java 接口產(chǎn)生了 WSDL 文檔。
WSDL:web service description language

從我們移動(dòng)開發(fā)的角度來(lái)看,需要消費(fèi)的 WSDL 文檔通常已經(jīng)存在,您需要做的僅僅是生成 JSR 172 WSA 存根。要生成這些存根,您應(yīng)該使用例如J2ME Wireless Toolkit 2.1存根生成器這樣的工具,如下圖所示:


圖 3 - 生成 JSR 172 WSA 存根

該生成器生成存根 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:

它支持:

  1. SOAP 1.1。
  2. 任何可以傳送 SOAP 消息的傳輸,例如 HTTP 1.1,都有一個(gè)定義好的用于 SOAP 1.1 的協(xié)議綁定。
  3. SOAP 消息的文字表示代表一個(gè) RPC 調(diào)用或應(yīng)答。
    下面(是)數(shù)據(jù)類型和相應(yīng)的 Java 映射:
    • xsd:booleanbooleanBoolean
    • xsd:bytebyteByte 。
    • xsd:shortshortShort 。
    • xsd:intintInteger 。
    • xsd:longlongLong 。
    • xsd:floatfloat ,或 Float 。對(duì)基于 CLDC 1.0 的平臺(tái),該數(shù)據(jù)類型映射到 String。
    • xsd:doubledouble ,或 Double 。對(duì)基于 CLDC 1.0 的平臺(tái),該數(shù)據(jù)類型映射到 String。
    • xsd:stringString
    • xsd:base64Binarybyte[] 。
    • xsd:hexBinarybyte[] 。
    • xsd:complexType 到基本類型和類類型序列。
    • xsd:QNamejavax.xml.namespace.QName 。
    • 以 XML 數(shù)組模式為基礎(chǔ)的基本類型和復(fù)雜類型(結(jié)構(gòu)中包含基本類型或復(fù)雜類型)數(shù)組。

它不支持:

  • 帶附件的 SOAP 消息。
  • SOAP 消息處理器。
  • SOAP 消息的編碼表示。
  • 服務(wù)端點(diǎn)(不是 Web 服務(wù)生產(chǎn)者)。
  • 服務(wù)發(fā)現(xiàn)支持 (UDDI)。

設(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ù)。


清單 1:調(diào)用遠(yuǎn)程服務(wù)
            package j2medeveloper.wsasample            // MIDP            import javax.microedition.midlet.MIDlet;            import javax.microedition.lcdui.Display;            import javax.microedition.lcdui.Form;            ...            Form form = new Form("Employee Info");            ...            // JAX-RPC            import java.rmi.RemoteException;            String serviceURL = "www.j2medeveloper.com/webservicesample";            ...            /**            * Entry point to MIDlet, from start or restart states.            * @throws javax.microedition.midlet.MIDletStateChangeException            */            public void startApp() throws MIDletStateChangeException {            // Instantiate the service stub.            EmployeeService_Stub service = new EmployeeService_Stub();            // Initialize the stub/service.            service._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,            serviceURL);            service._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, new            Boolean(true));            ...            display.setCurrent(mainScreen);            }            /**            * Paused state. Release resources (connection, threads, etc).            */            public void pauseApp() {            ...            }            /**            * Destroy state.  Release resources (connection, threads, etc).            * @param uc If true when this method is called, the MIDlet must            * cleanup and release all resources. If false the MIDlet may            * throw MIDletStateChangeException  to indicate it does not want            * to be destroyed at this time.            * @throws javax.microedition.midlet.MIDletStateChangeException            * to indicate it does not want to be destroyed at this time.            */            public void destroyApp(boolean uc) throws MIDletStateChangeException {            ...            }            :            :            /**            * Command Listener.            * @param c is the LCDUI Command.            * @param d is the source Displayable.            */            public void commandAction(Command c, Displayable d) {            if (c == UiConstants.COMMAND_GET_EMPINFO) {            Thread th = new Thread(new GetEmpInfoTask());            th.start();            } else {            ...            }            :            :            }            /**            * On its own thread, invoke the remote service getEmployeeInfo            */            public class GetEmpInfoTask implements Runnable {            public void run() {            try {            // Invoke the remote service.            EmployeeInfo empInfo =            service.getEmployeeInfo(empId);            :            :            // Display the employee Information            form.append("Name:" +            empInfo.firstname+empInfo.lastname);            form.append("Status:"+empInfo.status);            :            :            display.setCurrent(form);            } catch (RemoteException e) {            // Handle RMI exception.            } catch (Exception e) {            // Handle exception.            }            }            }            :            :            

注意遠(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。







參考資料

  • 您可以參閱本文在 developerWorks 全球站點(diǎn)上的英文原文.

  • 有關(guān)JCP JSR 172 規(guī)范的詳細(xì)信息,請(qǐng)?jiān)L問(wèn) JCP 站點(diǎn)。

  • 下載J2ME Wireless Toolkit 2.1。

  • 可以在 WS-I 站點(diǎn)上獲得WS-I 基本概要 1.0 版規(guī)范。

  • 免費(fèi)教程指導(dǎo)您如何“為移動(dòng)設(shè)備開發(fā) Web 服務(wù)客戶端”(developerWorks,2004 年 3 月)。

  • 從“用 Java 技術(shù)和 IBM Web 服務(wù)工具包進(jìn)行跨平臺(tái)編程開發(fā)移動(dòng)設(shè)備”(developerWorks,2003 年 2 月)這篇文章學(xué)習(xí)更多關(guān)于如何開發(fā)的知識(shí)。

  • 閱讀簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議 (SOAP) 1.1,它定義了傳輸和數(shù)據(jù)編碼。

  • 查看Web 服務(wù)定義語(yǔ)言 (WSDL) 1.1,它定義了如何描述遠(yuǎn)程服務(wù)。

  • 閱讀XML 1.0,它定義了 XML 標(biāo)識(shí)語(yǔ)言。

  • 閱讀XML Schema,它定義了 XML 模式。

  • developerWorks 無(wú)線技術(shù)專區(qū)可以找到關(guān)于無(wú)線技術(shù)領(lǐng)域各個(gè)方面的文章。

  • 訂閱 IBM 的WebSphere 開發(fā)者技術(shù)者期刊學(xué)習(xí)更多的技術(shù)。

  • 訪問(wèn)Developer Bookstore,那里有比較全面的技術(shù)書籍,包括許多無(wú)線相關(guān)主題的書。

  • 參閱無(wú)線專區(qū)教程頁(yè),有來(lái)自developerWorks的全面的無(wú)線主題免費(fèi)教程。

  • 是否對(duì)無(wú)需通常的高成本入口點(diǎn)(entry point )或短期評(píng)估許可證的 IBM 測(cè)試產(chǎn)品感興趣?developerWorks Subscription 為 WebSphere、DB2、Lotus、Rational 以及 Tivoli 產(chǎn)品提供了低成本的 12 個(gè)月單用戶許可證,包括基于 Eclipse 的 WebSphere Studio IDE,用于開發(fā)、測(cè)試、評(píng)估和展示您的應(yīng)用程序。






關(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)系。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
JAX-RPC vs JAX-WS(二):
Web service簡(jiǎn)介
WebService CXF學(xué)習(xí)(進(jìn)階篇2):JAX-WS講解
Java開源Portal門戶類別列表
PORTAL門戶平臺(tái)(27個(gè))
IBM developerWorks 中國(guó) : Java Web 服務(wù)專題
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服