背景
嵌入式裝置 (J2ME) 需接入企業 SOA 架構,核心挑戰:
- J2ME 基礎類庫無 SOAP 支援。
- CLDC/MIDP 受限於記憶體與處理器,資源極其有限。
- 需處理 XML (SOAP 訊息封裝)。
J2ME 架構回顧
- 配置:CLDC (手持裝置)、CDC (機頂盒等)。定義最小 JVM 與核心類庫。
- 配置檔:MIDP (手機)、PDAP (PDA)、Foundation/ Personal Profile (CDC) 等,提供特定領域 API。
SOAP 協議要點
- XML 編碼的輕量級 RPC 協議,透過 HTTP 傳輸,易穿透防火牆。
- 訊息結構:Envelope (Header 可選 + Body 必選),Body 含方法呼叫與參數 (Section 5 編碼)。
J2ME 實現 SOAP 客戶端關鍵技術
1. 資料類型映射
J2ME 缺少部分 Java SE 類型 (如 BigDecimal、完整 Collections),僅用基本類型組合模擬複雜類型。
2. XML 解析器選擇
| 解析器 | 特點 | 適用性 |
| DOM | 樹狀記憶體、易遍歷 | 記憶體較大裝置 (CDC) |
| SAX | 事件驅動、低記憶體 | CLDC/MIDP 首選 |
| KXML (Pull) | 極輕量 (~25KB)、支援 DOM/自有 Pull API | 強推薦用於 MIDP |
KXML DOM 範例
Document doc = new Document();
XMLParser parser = new XMLParser(new InputStreamReader(is));
doc.parse(parser);
// 遍歷
Element root = doc.getRootElement();
for (int i=0; i
JSR 172 (J2ME Web Services) 規範
- 提供兩個可選包:JAX-RPC 子集 (同步 RPC 呼叫,~25-30KB) + SAX 解析器 (~35KB)。
- 建立
SAXParserFactory → SAXParser → parse(InputStream, DefaultHandler)。
- 擴展
DefaultHandler 覆寫 startElement/endElement/characters 等事件方法,以堆疊追蹤標籤層級並建構物件模型。
代碼片段:SAX Handler
class BasicHandler extends DefaultHandler {
Vector phones = new Vector();
Stack tagStack = new Stack();
public void startElement(String uri, String local, String qName, Attributes attrs) {
tagStack.push(qName);
if ("phone".equals(qName)) phones.addElement(new Phone());
}
public void endElement(String uri, String local, String qName) {
tagStack.pop();
}
public void characters(char[] ch, int start, int len) {
String tag = (String) tagStack.peek();
// 根據 tag 將字串填入當前 Phone 物件屬性
}
public void endDocument() { /* 顯示解析結果 */ }
}
總結
透過 KXML 或 JSR 172 SAX 解析器擴展 J2ME XML 處理能力,配合基本類型模擬 SOAP 編碼,可讓 MIDP 裝置無縫呼叫企業 Web Services,解決嵌入式數據來源不足、擴展應用範圍。
本文來自編程入門網:原文連結
- 上一篇文章: J2ME 遊戲精靈碰撞檢測:矩形邊界與像素級兩種算法實現
- 下一篇文章: J2ME Graphics.setClip 方法詳解:實現圖集單張繪製
Copyright ©
程式碼之家 All Rights Reserved