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

J2ME Web 服務 API (JSR 172) 深度解析:從 JAX-RPC 存根到 XML 解析

     編輯:J2ME

標準定位:JSR 172 為什麼重要?

JSR 172 為 J2ME 定義了兩個可選包:

  1. JAX-RPC 子集:遠程服務調用(存根/綁定/序列化)
  2. XML 解析子集:SAX/DOM/StAX 輕量實現

目標配置:CDC / CLDC 1.0 / CLDC 1.1。意義:開發者無需自行實現 SOAP 封裝、WSDL 解析、XML 處理,直接調用生成的存根即可消費企業級 Web Service。

標準合規性對照

規範版本JSR 172 支援
SOAP1.1✅ 完整支援(編碼/傳輸)
WSDL1.1✅ 服務描述解析
XML1.0✅ 核心標記語言
XML Schema1.0✅ 類型系統映射
UDDI2.0❌ 不支援服務發現
WS-I Basic Profile1.0✅ 互操作性基線合規

開發流程:從 WSDL 到調用

  1. 獲取 WSDL:從服務提供方或 UDDI 註冊中心(手動)
  2. 生成存根:使用 WTK 內建 wscompile 或第三方工具(如 Axis2 wsdl2java -p j2me)生成 Client Stub
  3. 編譯/預驗證:存根代碼需經過 preverify 才能在設備運行
  4. 打包部署:Stub + JSR 172 Runtime JAR 隨 MIDlet 發布

核心調用代碼模式


// 1. 實例化存根(生成的類,繼承 javax.xml.rpc.Stub)
MyService_Stub stub = new MyService_Stub();

// 2. 最小化初始化:設置端點地址
stub._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,
    "https://example.com/services/MyService");

// 3. 可選:設置 SOAP Action、超時、認證頭
stub._setProperty(Stub.PROPERTY_SOAP_ACTION, "urn:doWork");
stub._setProperty("javax.xml.rpc.security.auth.username", "user");
stub._setProperty("javax.xml.rpc.security.auth.password", "pwd");

// 4. 像呼叫本地方法一樣調用遠程服務
try {
    ResultType result = stub.doWork(param1, param2);
    // 處理結果...
} catch (RemoteException e) {
    // 網絡/序列化/協議錯誤統一捕獲
    handleCommError(e);
}

存根與運行時如何隱藏複雜度

  • 序列化/反序列化:Java 基本類型 ↔ XML Schema 類型自動映射
  • SOAP 封包/解包:Header/Body/Encoding 自動處理
  • HTTP 传輸:基於 HttpConnection,支援 Keep-Alive、Chunked
  • 異常映射:SOAP Fault → RemoteException 子類

XML 解析子包使用場景

當服務返回非標準 XML、或需解析本地配置/資訊清單時:


// SAX 解析範例(輕量、流式)
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
parser.parse(inputStream, new DefaultHandler() {
    public void startElement(String uri, String local, String qName, Attributes attrs) {
        if ("item".equals(qName)) {
            String id = attrs.getValue("id");
            // 處理...
        }
    }
});

// DOM 解析(需完整樹結構,記憶體敏感)
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(inputStream);
NodeList items = doc.getElementsByTagName("item");
// 遍歷...

效能與體積優化策略

策略效果代價
僅包含用到的存根類JAR 減 30~50%需手動裁剪或構建腳本自動化
啟用代碼混淆再減 15~20%需保留存根公共接口不混淆
SAX 替代 DOM運行時記憶體降 60%+無法隨機訪問、回調編程較繁瑣
壓縮 SOAP 傳輸流量減 40%+需伺服器端支援 gzip/deflate

常見坑與規避

  1. CLDC 1.0 無 float/double:Schema 中 xsd:float 映射為 int(定點數)或 String,避免運行時 NoClassDefFoundError。
  2. 超時設置:預設無超時,必須在存根或 HttpConnection 層設置連接/讀取超時,防止死等。
  3. 證書驗證:HTTPS 服務需將 CA 證書打包進 MIDlet 或裝置信任存儲,否則 CertificateException。
  4. 命名空間衝突:多服務存根合併時包名隔離,避免類衝突。

結語

JSR 172 讓 J2ME 設備以標準化、輕量級方式接入企業 SOA 體系。掌握「WSDL→存根→調用」工具鏈、選對解析器(SAX/DOM)、做好體積與流量優化,即可在功能機上構建穩健的移動業務客戶端。

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