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

J2ME 聯網應用開發:KSOAP 輕量級 Web Service 客戶端快速上手

     編輯:J2ME

前言

在行動裝置呼叫 Web Service,kSOAP 是最輕量、成熟的選擇。本文以簡單「字串轉大寫」服務為例,示範伺服器端發布 (Axis) 與 J2ME 客戶端呼叫完整流程。

伺服器端:Axis 發布 Web Service

1. 實作類別

package com.jagie.J2ME.ws;

public class StringProcessor {
    public String process(String name) {
        return name.toUpperCase();
    }
}

2. 部署結構

jagiews/ (Web App 根目錄)
├── WEB-INF/
│   ├── web.xml
│   ├── server-config.wsdd
│   ├── classes/
│   │   └── com/jagie/J2ME/ws/StringProcessor.class
│   └── lib/
│       ├── axis.jar, axis-ant.jar, commons-discovery.jar
│       ├── commons-logging.jar, jaxrpc.jar, log4j-1.2.8.jar
│       ├── saaj.jar, wsdl4j.jar

3. 關鍵設定檔

server-config.wsdd:定義服務 StringProcess,允許方法 process,類別 com.jagie.J2ME.ws.StringProcessor。

web.xml:配置 AxisServlet 對應 /services/*,AdminServlet、SOAPMonitorService 等。

4. 部署與測試

  1. 將 jagiews 發布為 Web Application (如 WebLogic: https://localhost:7001/jagiews)
  2. 瀏覽器測試:https://localhost:7001/jagiews/services/StringProcess?method=process&name=qqQQ
  3. 回傳 XML 含 QQQQ 即成功

客戶端:J2ME + kSOAP 呼叫

前置準備

  • 下載 kSOAP 穩定版 (ksoap.enhydra.org),加入 classpath
  • 網路操作必須在獨立執行緒,避免阻塞 UI 導致畫面凍結

三種呼叫方式比較

  1. HttpConnection + kXML 解析:最原始,手工組 SOAP、解 XML
  2. JSR-172:MIDP 2.0 選用包,標準化但手機支援有限
  3. kSOAP API:本文採用,封裝 SOAP 細節,介面簡潔

客戶端核心代碼

1. MIDlet 主類別

package com.jagie.J2ME.ws;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class WSClientMIDlet extends MIDlet {
    static WSClientMIDlet instance;
    public WSClientMIDlet() { instance = this; }
    public void startApp() {
        Display.getDisplay(this).setCurrent(new DisplayForm());
    }
    public void pauseApp() {}
    public void destroyApp(boolean u) {}
    public static void quitApp() {
        instance.destroyApp(true); instance.notifyDestroyed(); instance = null;
    }
}

2. 介面類別 (含呼叫邏輯)

package com.jagie.J2ME.ws;
import javax.microedition.lcdui.*;

public class DisplayForm extends Form implements CommandListener, Runnable {
    private TextField textField1;
    private Thread t;

    public DisplayForm() {
        super("字串轉換 WebService 測試");
        textField1 = new TextField("待處理字串:", "", 15, TextField.ANY);
        append(textField1);
        addCommand(new Command("Exit", Command.EXIT, 1));
        addCommand(new Command("Process", Command.OK, 1));
        setCommandListener(this);
    }

    public void commandAction(Command cmd, Displayable d) {
        if (cmd.getCommandType() == Command.EXIT) WSClientMIDlet.quitApp();
        else if (cmd.getCommandType() == Command.OK) { t = new Thread(this); t.start(); }
    }

    public void run() {
        String input = textField1.getString();
        String result = new StringProcessorStub().process(input);
        append(new StringItem("處理結果:", result));
    }
}

3. Web Service Stub (kSOAP 核心)

package com.jagie.J2ME.ws;
import org.ksoap.*;
import org.ksoap.transport.HttpTransport;

public class StringProcessorStub {
    public String process(String name) {
        String result = null;
        try {
            // 建立 SOAP 物件:命名空間 + 方法名
            SoapObject rpc = new SoapObject(
                "https://localhost:7001/jagiews/services/StringProcess", "process");
            rpc.addProperty("name", name); // 參數

            // HTTP 傳輸層
            HttpTransport ht = new HttpTransport(
                "https://localhost:7001/jagiews/services/StringProcess", "");

            // 同步呼叫並取得回傳值
            result = (String) ht.call(rpc);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}

關鍵總結

  • kSOAP 讓手機呼叫 Web Service 變得簡單:SoapObject 封裝請求,HttpTransport.call() 同步取得回應。
  • 網路操作必須另開執行緒 (如範例 run() 中執行),否則 commandAction 阻塞會凍結畫面。
  • 伺服器端 Axis 部署需正確配置 server-config.wsdd 與 web.xml,Jar 包齊全。
  • 實際部署時將 localhost 替換為真實伺服器 IP/域名。

有了 kSOAP,J2ME 整合企業級 Web Service 近在咫尺。

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