J2ME 作為嵌入式平台發展迅猛,但受限於硬件資源,功能有限。企業應用轉向 SOA,Web Service 普及,嵌入式設備亟需處理 SOAP 協議能力。本文分析 J2ME 實現 SOAP 面臨的兩大難題並給出解決方案。
J2ME 架構回顧
三層:JVM 層、配置層、概要文件層。兩大配置:
- CLDC:針對手持設備(PDA、手機),處理器能力弱,內存 128–512KB。
- CDC:針對固定設備(機頂盒),32/64 位處理器,內存 >512KB。
五大標準概要文件:MIDP(移動設備/CLDC)、PDA Profile(CLDC)、Foundation Profile(CDC/無 GUI)、Personal Profile(CDC/完整 GUI)、RMI Profile(CDC/RMI)。
SOAP 協議要點
- XML 編碼數據傳輸協議,規範極簡,僅定義關鍵部分。
- 客戶端構建 XML(含遠程調用信息),通常通過 HTTP 發送,穿透防火牆。
- 服務端監聽、分發、解釋 SOAP 消息。
- 編碼規則(Section 5):簡單類型、復合類型(結構、數組、複雜類型)。
- 消息結構:MIME
text/xml,SOAP Envelope(Header 可選 + Body 必選),支持附件。
J2ME 實現 SOAP 客戶端的兩大挑戰
- 數據類型不匹配:J2ME 配置間類型差異,與 SOAP 編碼類型不一致。
- 缺乏 XML 解析能力:基礎庫無 XML 處理功能。
解決方案
類型不匹配 → 僅用基本類型組合
避免直接映射複雜類型,用基本類型組合模擬 SOAP 數據結構。
XML 解析:DOM vs SAX vs Pull
| 方案 | 優點 | 缺點 | 適用性 |
| DOM | 樹結構直觀,隨機訪問 | 全樹駐留內存,嵌入式設備負擔重 | 小文檔、內存充裕 |
| SAX | 事件驅動,內存佔用極低 | 單向流式,無法隨機訪問,編碼複雜 | 大文檔、內存受限 |
| Pull (KXML) | 輕量(~20KB),支持 DOM 風格 API,亦可流式 | 非標準 API | J2ME 首選 |
KXML 代碼示例
// DOM 風格解析
Document doc = new Document();
XmlParser parser = new XmlParser(inputStreamReader);
doc.parse(parser);
Element root = doc.getRootElement();
for (int i = 0; i < root.getChildCount(); i++) {
Element kid = root.getElement(i);
if ("abc".equals(kid.getName())) {
// 遍歷子元素處理業務邏輯
}
}
JSR 172:標準化的 J2ME Web Service 支持
JSR 172 定義兩個可選包(極輕量):
- JAX-RPC 子集:支持同步 RPC 調用(~25–30KB)。
- SAX 解析器:~35KB,標準
SAXParserFactory + DefaultHandler 事件回調模型。
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
InputStream is = getClass().getResourceAsStream("phone.xml");
saxParser.parse(is, new BasicHandler(this));
BasicHandler 繼承 DefaultHandler,覆寫 startElement、characters、endElement 等方法,用 Stack 維護標籤層級,Vector 收集解析對象。
結語
通過擴展 XML 處理能力(KXML 或 JSR 172),J2ME 設備可構建 SOAP 客戶端,無縫接入企業現有 Web Service,解決數據源不足、拓寬嵌入式應用邊界。此技術路徑對企業系統集成具推廣價值。
- 上一篇文章: 基於 Swing 的圖書館系統 XML 框架設計
- 下一篇文章: 用 Sun ONE Studio 快速構建與部署 Web 服務
Copyright ©
程式碼之家 All Rights Reserved