MIDlet (Client) HTTP/GET/POST ASP (Server) Access DB
+----------------+ --------------------> +----------------+ +----------------+
| HttpConnection | | Request/Response| | ADODB.Connection|
| GET/POST + URL | | QueryString | | Recordset |
| InputStream | | Response.Write | | SQL Insert/Select|
+----------------+ +----------------+ +----------------+
MIDP 無 JDBC、無本地資料庫存取能力,透過 HTTP 協議 與伺服器端腳本 (ASP/PHP/JSP/Servlet) 交互,由伺服器代理資料庫操作,是 J2ME 連接企業資料的標準模式。
https://localhost/ 可訪問)。D:\J2ME\J2METEST\IIS\DATABASE\J2MEtest.mdb,資料表 Message:ID : AutoNumber (Primary Key)
MESSAGE : Text (255)
IP : Text (50)
DATE : Date/Time
ConnectASP.asp<%@ LANGUAGE=VBScript %>
<%
' 1. 資料庫連線字串
strDBLocation = Server.MapPath("/database/J2METest.mdb")
strConn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & strDBLocation
' 2. 開啟連線
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConn
' 3. 取得參數
ip = Request.ServerVariables("REMOTE_ADDR")
message = Request.QueryString("message")
' 4. 寫入資料
Set rs = Server.CreateObject("ADODB.Recordset")
rs.ActiveConnection = cnn
rs.CursorType = 1 ' adOpenKeyset
rs.LockType = 2 ' adLockOptimistic
rs.Source = "Message"
rs.Open
rs.AddNew
rs("Message") = message
rs("IP") = ip
rs("Date") = Now()
rs.Update
' 5. 關閉資源
rs.Close
cnn.Close
' 6. 回應客戶端
Response.Write "The message written successfully."
%>
瀏覽器訪問:https://localhost/asp/ConnectASP.asp?message=Hello+J2ME! → 應顯示成功訊息,資料庫出現新記錄。
import javax.microedition.midlet.*;
import javax.microedition.io.*;
import java.io.*;
public class ConnectASPMidlet extends MIDlet {
public void startApp() {
try { testASP(); }
catch (IOException e) { System.out.println("HTTP Error: " + e); }
notifyDestroyed();
}
private void testASP() throws IOException {
String url = "https://localhost/asp/ConnectASP.asp?message=Hello+J2ME!";
HttpConnection conn = null;
InputStream in = null;
try {
conn = (HttpConnection) Connector.open(url);
conn.setRequestMethod(HttpConnection.GET);
in = conn.openInputStream();
int ch;
StringBuffer sb = new StringBuffer();
while ((ch = in.read()) != -1) {
sb.append((char) ch);
}
System.out.println("Server Response: " + sb.toString());
} catch (ConnectionNotFoundException e) {
System.out.println("HTTP connection failed: " + e);
} finally {
if (in != null) try { in.close(); } catch (IOException ignore) {}
if (conn != null) try { conn.close(); } catch (IOException ignore) {}
}
}
public void pauseApp() {}
public void destroyApp(boolean unconditional) {}
}
| 議題 | 建議做法 |
|---|---|
| 參數編碼 | 中文參數必須 URLEncoder.encode(str, "UTF-8") (J2ME 無內建,需自行實作或用 javax.microedition.io.HttpConnection 的 POST 傳遞 body) |
| POST 大量資料 | 改用 conn.setRequestMethod(HttpConnection.POST),OutputStream out = conn.openOutputStream() 寫入 application/x-www-form-urlencoded 或 JSON |
| 回應格式 | 統一用 JSON (輕量、易解析),伺服端 Response.ContentType = "application/json; charset=UTF-8",客戶端用 org.json.me 解析 |
| 錯誤處理 | ASP 端 On Error Resume Next + 回傳 JSON {"code":500,"msg":"..."},MIDlet 依 code 判斷重試/提示 |
| 安全性 | HTTPS (MIDP 2.0+)、請求簽名 (HMAC-SHA1)、IP 白名單、SQL 參數化 (ASP 用 Command.Parameters) |
| 效能優化 | 連線池 (IIS 內建)、資料庫索引、分頁查詢、GZIP 壓縮回應 (MIDP 2.0 支援 Content-Encoding: gzip) |
| 離線同步 | 本地 RMS 佇列操作,有網時批次同步至伺服器 |
/MyJ2MEApp
/src
ConnectASPMidlet.java
HttpUtil.java // 封裝 GET/POST/JSON 解析/錯誤處理
Config.java // 伺服器基礎 URL、超時、重試參數
/server
/asp
ConnectASP.asp
Common.asp // 連線字串、錯誤處理、JSON 輸出工具函式
/database
J2MEtest.mdb
build.xml // Ant + ProGuard + Polish 自動化建構
jad.template // JAD 模板 (版本號、MIDlet-Name 等佔位符)
J2ME 透過 HttpConnection 與 ASP (或任何 HTTP 後端) 互連,是「瘦客戶端 + 胖伺服器」架構在行動裝置上的經典落地。掌握「GET/POST 選擇、參數編碼、JSON 協議、異常重試、HTTPS 安全」五大核心,即可構建穩健、可擴展的行動資料應用。