首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME Web 服務入門指南:JSR 172 規範核心解析與實戰

     編輯:J2ME

前言:移動設備連接企業級服務的橋樑

在智能機普及前,J2ME 設備如何調用遠端 Web Service?JSR 172(J2ME Web Services Specification)給出了標準答案。它將 JAX-RPC 1.1 子集與 SAX2 子集引入 CLDC/MIDP 環境,讓資源受限的手機也能以標準 SOAP/HTTP 協議消費企業級服務,無需在每個 MIDlet 中重複造輪子。

一、 核心規範與標準體系

JSR 172 遵循 WS-I Basic Profile 1.0,確保互操作性,基於四大基石:

二、 架構模型:三元角色

  1. 無線感知應用(客戶端):含 JSR 172 Stub 與 Runtime,運行於 MIDP/CDC 設備。
  2. 無線網絡與 Internet:HTTP/HTTPS 承載 SOAP/XML,或經無線網關轉換為二進制協議(如 WBXML)以節省頻寬。
  3. Web 服務端(服務提供者):部署於防火牆後的應用服務器,暴露 WSDL 端點。

關鍵限制:J2ME 設備僅能作為服務消費者,不能發布服務;不支持 SOAP with Attachments、SOAP Handler、UDDI 查詢。

三、 JSR 172 運行時與 SPI

運行時隱藏連接管理、SOAP 編碼/解碼、序列化等底層細節。SPI(Service Provider Interface)將 Stub 與具體實現解耦,保證 Stub 可移植。開發者無需直接調用 SPI,僅通過生成的 Stub 交互。

四、 JAX-RPC 子集 API 亮點

  • 完整支持 WS-I Basic Profile、SOAP 1.1、HTTP 1.1 傳輸。
  • 數據類型:基本類型、String、陣列、複雜類型(結構體);CLDC 1.0 下 float/double 映射為 String。
  • 僅支持 Document/Literal 消息模式,不支持 RPC/Encoded。
  • 核心包:javax.microedition.xml.rpc、javax.xml.namespace、javax.xml.rpc、java.rmi(子集)。

五、 從 WSDL 生成 Stub 到調用服務

1. 生成 Stub(以 Sun WTK 2.1 為例)

// 命令行或 KToolbar → Utilities → Stub Generator
// 輸入:WSDL URL、輸出路徑、包名、目標 CLDC 版本
// 輸出:實現 Stub 接口與遠程接口的類、輔助類

2. 客戶端調用代碼片段

String endpoint = "https://example.com/pubwebservice";
PubService_Stub stub = new PubService_Stub();
stub._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, endpoint);
stub._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, Boolean.TRUE);

try {
    WirelessArticle article = stub.getArticleByID("IntroJSR172");
    // 在獨立線程中調用,避免阻塞 UI
    Form form = new Form(article.getShortTitle());
    form.append(wrap(article.getSummary()));
    Display.getDisplay(this).setCurrent(form);
} catch (RemoteException e) { /* 網絡/協議異常 */ }
catch (Exception e) { /* 其他 */ }

同步請求-響應模型:調用線程阻塞直到收到響應或超時,所有編碼/解碼由 Stub+Runtime 透明完成。

六、 WSDL 到 Java 類型映射表

標準版本角色
SOAP1.1傳輸與數據編碼
WSDL1.1服務接口描述
UDDI2.0服務發現(JSR 172 僅客戶端,不含 UDDI API)
XML / XML Schema1.0數據建模與驗證
WSDL 類型Java 類型備註
xsd:stringString
xsd:intint / Integer
xsd:float / xsd:doubleString / float / FloatCLDC 1.0 必須用 String
xsd:base64Binary / hexBinarybyte[]
xsd:complexType序列化類對應生成的複雜類型類

七、 JAXP 子集:輕量級 XML 解析

  • 基於 SAX2 子集,事件驅動,內存佔用極低,適合 MIDP 設備。
  • 支持命名空間、UTF-8/16、DTD 驗證(可選,CLDC 環境建議關閉)。
  • 不支持 DOM、XSLT。
  • 核心類:SAXParserFactory、SAXParser、DefaultHandler(覆寫 startElement、characters、endElement 等)。

解析 RSS Feed 示例

SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
String rss = service.getRSSFeed(); // 遠程調用獲取 XML 字符串
parser.parse(new ByteArrayInputStream(rss.getBytes("UTF-8")), new RSSHandler());

八、 開發工具鏈:J2ME Wireless Toolkit 2.1+

  • 內建 JSR 172 庫與 Stub Generator(圖形界面/命令行雙模式)。
  • 提供 JSR172Demo 範例項目,涵蓋 Stub 生成、調用、XML 解析全流程。
  • 支持創建多設備配置(DefaultColorPhone、QwertyDevice 等)並行測試。

九、 最佳實踐與避坑指南

  1. 網絡操作必須在獨立線程,否則阻塞 UI 導致設備凍結或被 AMS 強制殺掉。
  2. 針對 CLDC 1.0/1.1 同時發布時,浮點類型統一映射為 String,避免運行時錯誤。
  3. 啟用二進制編碼(WBXML 等):確保網關與設備雙端透明支持,大幅降低流量成本。
  4. 異常處理分層:捕獲 RemoteException(通信層)與業務異常(FaultDetailException)分開處理。
  5. 安全性:生產環境強制 HTTPS,驗證服務端證書;敏感數據勿明文傳輸。

十、 總結

JSR 172 將企業級 Web Service 能力下沉至資源受限的 J2ME 終端,以標準化 API 屏蔽了 SOAP/HTTP/XML 的復雜性。雖然今日視角看其技術棧已歷史化,但其「薄客戶端+厚服務端」、「運行時下沉」、「工具鏈生成 Stub」的設計哲學,仍深刻影響著現代移動開發框架(如 Retrofit、gRPC Mobile)的架構演進。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved