架構:Android (Client) → Tomcat (Servlet/REST) → MySQL。資料傳輸格式統一用 **JSON**,無論單筆或多筆皆適用。
@WebServlet("/api/user/*")
public class UserServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String id = req.getPathInfo().substring(1); // /api/user/123 → 123
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id=?")) {
ps.setString(1, id);
ResultSet rs = ps.executeQuery();
resp.setContentType("application/json;charset=UTF-8");
if (rs.next()) {
JSONObject json = new JSONObject();
json.put("id", rs.getInt("id"));
json.put("name", rs.getString("name"));
json.put("email", rs.getString("email"));
resp.getWriter().write(json.toString());
} else {
resp.setStatus(404);
resp.getWriter().write("{\"error\":\"Not found\"}");
}
} catch (SQLException e) {
resp.setStatus(500);
resp.getWriter().write("{\"error\":\"" + e.getMessage() + "\"}");
}
}
}
@WebServlet("/api/users")
public class UsersServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
int page = Integer.parseInt(req.getParameter("page"));
int size = Integer.parseInt(req.getParameter("size"));
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM users LIMIT ? OFFSET ?")) {
ps.setInt(1, size);
ps.setInt(2, (page-1)*size);
ResultSet rs = ps.executeQuery();
JSONArray arr = new JSONArray();
while (rs.next()) {
JSONObject o = new JSONObject();
o.put("id", rs.getInt("id"));
o.put("name", rs.getString("name"));
arr.put(o);
}
resp.setContentType("application/json;charset=UTF-8");
resp.getWriter().write(arr.toString());
} catch (SQLException e) {
resp.setStatus(500);
resp.getWriter().write("{\"error\":\"" + e.getMessage() + "\"}");
}
}
}
// 單筆
Request req = new Request.Builder()
.url("https://api.example.com/api/user/123")
.build();
client.newCall(req).enqueue(new Callback() {
@Override public void onResponse(Call call, Response res) {
if (res.isSuccessful()) {
User user = new Gson().fromJson(res.body().string(), User.class);
runOnUiThread(() -> textView.setText(user.name));
}
}
@Override public void onFailure(Call call, IOException e) { e.printStackTrace(); }
});
// 多筆
Request req2 = new Request.Builder()
.url("https://api.example.com/api/users?page=1&size=20")
.build();
// 解析 List 同理
掌握「Servlet 回傳 JSON → Android OkHttp/Gson 解析」這套標準流程,單筆多筆通用,擴充性極佳。