在智能機普及前,J2ME 設備如何調用遠端 Web Service?JSR 172(J2ME Web Services Specification)給出了標準答案。它將 JAX-RPC 1.1 子集與 SAX2 子集引入 CLDC/MIDP 環境,讓資源受限的手機也能以標準 SOAP/HTTP 協議消費企業級服務,無需在每個 MIDlet 中重複造輪子。
| 標準 | 版本 | 角色 |
| SOAP | 1.1 | 傳輸與數據編碼 |
| WSDL | 1.1 | 服務接口描述 |
| UDDI | 2.0 | 服務發現(JSR 172 僅客戶端,不含 UDDI API) |
| XML / XML Schema | 1.0 | 數據建模與驗證 |
二、 架構模型:三元角色
- 無線感知應用(客戶端):含 JSR 172 Stub 與 Runtime,運行於 MIDP/CDC 設備。
- 無線網絡與 Internet:HTTP/HTTPS 承載 SOAP/XML,或經無線網關轉換為二進制協議(如 WBXML)以節省頻寬。
- 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 類型映射表
| WSDL 類型 | Java 類型 | 備註 |
| xsd:string | String | |
| xsd:int | int / Integer | |
| xsd:float / xsd:double | String / float / Float | CLDC 1.0 必須用 String |
| xsd:base64Binary / hexBinary | byte[] | |
| 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 等)並行測試。
九、 最佳實踐與避坑指南
- 網絡操作必須在獨立線程,否則阻塞 UI 導致設備凍結或被 AMS 強制殺掉。
- 針對 CLDC 1.0/1.1 同時發布時,浮點類型統一映射為 String,避免運行時錯誤。
- 啟用二進制編碼(WBXML 等):確保網關與設備雙端透明支持,大幅降低流量成本。
- 異常處理分層:捕獲
RemoteException(通信層)與業務異常(FaultDetailException)分開處理。
- 安全性:生產環境強制 HTTPS,驗證服務端證書;敏感數據勿明文傳輸。
十、 總結
JSR 172 將企業級 Web Service 能力下沉至資源受限的 J2ME 終端,以標準化 API 屏蔽了 SOAP/HTTP/XML 的復雜性。雖然今日視角看其技術棧已歷史化,但其「薄客戶端+厚服務端」、「運行時下沉」、「工具鏈生成 Stub」的設計哲學,仍深刻影響著現代移動開發框架(如 Retrofit、gRPC Mobile)的架構演進。
- 上一篇文章: J2ME 掃雷遊戲設計全攻略:從邏輯架構到核心代碼實現
- 下一篇文章: J2ME MIDlet 生命週期完全掌握:狀態轉換與 AMS 交互實戰
Copyright ©
程式碼之家 All Rights Reserved