JSR 172 為 J2ME 定義了兩個可選包:
目標配置:CDC / CLDC 1.0 / CLDC 1.1。意義:開發者無需自行實現 SOAP 封裝、WSDL 解析、XML 處理,直接調用生成的存根即可消費企業級 Web Service。
| 規範 | 版本 | JSR 172 支援 |
|---|---|---|
| SOAP | 1.1 | ✅ 完整支援(編碼/傳輸) |
| WSDL | 1.1 | ✅ 服務描述解析 |
| XML | 1.0 | ✅ 核心標記語言 |
| XML Schema | 1.0 | ✅ 類型系統映射 |
| UDDI | 2.0 | ❌ 不支援服務發現 |
| WS-I Basic Profile | 1.0 | ✅ 互操作性基線合規 |
wscompile 或第三方工具(如 Axis2 wsdl2java -p j2me)生成 Client Stubpreverify 才能在設備運行
// 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);
}
HttpConnection,支援 Keep-Alive、ChunkedRemoteException 子類當服務返回非標準 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 |
xsd:float 映射為 int(定點數)或 String,避免運行時 NoClassDefFoundError。HttpConnection 層設置連接/讀取超時,防止死等。CertificateException。JSR 172 讓 J2ME 設備以標準化、輕量級方式接入企業 SOA 體系。掌握「WSDL→存根→調用」工具鏈、選對解析器(SAX/DOM)、做好體積與流量優化,即可在功能機上構建穩健的移動業務客戶端。