Applet 運行於瀏覽器沙箱,Servlet 運行於伺服器。雙方透過 HTTP 協議通訊:Applet 發起 POST 請求攜帶參數,Servlet 處理後返回結果。本文提供雙端完整源碼,展示核心通訊流程。
// 核心通訊邏輯片段
String inputText = textField1.getText();
showStatus(inputText);
// 1. 構造 Servlet URL (相對於 Applet 文檔基址)
URL servletUrl = new URL(getDocumentBase(), "servlet/GetParameterServlet");
// 2. 開啟連線並配置 POST 模式
URLConnection connection = servletUrl.openConnection();
connection.setUseCaches(false);
connection.setDoOutput(true); // 關鍵:啟用輸出 = POST
// 3. 準備請求體 (application/x-www-form-urlencoded)
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(1024);
PrintWriter out = new PrintWriter(byteStream, true);
String postData = "Name=" + URLEncoder.encode(inputText);
out.print(postData);
out.flush();
// 4. 設定請求頭
String lengthString = String.valueOf(byteStream.size());
connection.setRequestProperty("Content-Length", lengthString);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 5. 發送請求體
byteStream.writeTo(connection.getOutputStream());
// 6. 讀取回應
BufferedReader br = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
textArea1.setText("");
String line;
while ((line = br.readLine()) != null && line.length() > 0) {
textArea1.appendText(line + "\n");
}
getDocumentBase():取得 Applet 載入頁面的基礎 URL,構造相對路徑 ServletsetDoOutput(true):觸發 POST 方法 (預設 GET)URLEncoder.encode():參數值必須編碼 (空格→+、特殊字元→%XX)ByteArrayOutputStream:先寫入記憶體計算 Content-Length,再一次性寫入連線public class GetParameterServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "Reading Request Parameters";
String name = request.getParameter("Name"); // 統一獲取參數
out.println(title);
out.println("Hello: " + name);
}
// POST 請求轉交給 doGet 處理 (業務邏輯同樣)
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
| 傳統痛點 | 現代方案 |
|---|---|
| Applet 已淘汰 (瀏覽器移除 Java 外掛) | 前端改用 JavaScript (Fetch/Axios) + REST API |
| 同步阻塞 UI 執行緒 | 非同步 `fetch()` / `XMLHttpRequest` + Promise/async-await |
| 手工拼裝表單資料 | `new FormData(form)` / `URLSearchParams` |
| 字元編碼手工處理 | 瀏覽器自動處理 UTF-8 |
| Servlet 手工輸出 HTML | 前後端分離:Servlet 返回 JSON,前端渲染 |