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

Applet 與 Servlet 通訊實戰:HTTP POST 完整代碼範例

     編輯:Java 程式設計入門

前言:跨邊界的雙向通訊

Applet 運行於瀏覽器沙箱,Servlet 運行於伺服器。雙方透過 HTTP 協議通訊:Applet 發起 POST 請求攜帶參數,Servlet 處理後返回結果。本文提供雙端完整源碼,展示核心通訊流程。

Applet 端:發起 POST 請求

// 核心通訊邏輯片段
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,構造相對路徑 Servlet
  • setDoOutput(true):觸發 POST 方法 (預設 GET)
  • URLEncoder.encode():參數值必須編碼 (空格→+、特殊字元→%XX)
  • ByteArrayOutputStream:先寫入記憶體計算 Content-Length,再一次性寫入連線
  • 流包裝鏈:`OutputStream` → `PrintWriter` (請求) / `InputStream` → `InputStreamReader` → `BufferedReader` (回應)

Servlet 端:處理 GET/POST 統一入口

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);
    }
}

部署注意事項

  1. Servlet 註冊於 `web.xml`:`/servlet/GetParameterServlet`
  2. Applet 頁面與 Servlet 同源 (同域名/埠),否則瀏覽器同源策略阻攔
  3. Applet 需簽名或調整安全策略才能發起網路連線 (無簽名 Applet 僅能連回源伺服器)

現代化改造建議

現代等效代碼 (JavaScript Fetch)

// 前端
async function submitName(name) {
    const response = await fetch('/api/hello', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ name })
    });
    const text = await response.text();
    document.getElementById('result').textContent = text;
}

// 後端 (Spring Boot 風格)
@PostMapping("/api/hello")
@ResponseBody
public String hello(@RequestBody Map<String, String> body) {
    return "Hello: " + body.get("name");
}

總結

Applet-Servlet 通訊是 Java Web 早期經典架構,展示了 HTTP 協議雙向通訊、序列化/反序列化、同源策略等核心概念。雖技術棧已過時,但「客戶端發起請求 → 伺服器處理 → 返回結果」的基本範式亙古不變。理解歷史實作有助於深刻掌握現代前後端分離架構的本質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
傳統痛點現代方案
Applet 已淘汰 (瀏覽器移除 Java 外掛)前端改用 JavaScript (Fetch/Axios) + REST API
同步阻塞 UI 執行緒非同步 `fetch()` / `XMLHttpRequest` + Promise/async-await
手工拼裝表單資料`new FormData(form)` / `URLSearchParams`
字元編碼手工處理瀏覽器自動處理 UTF-8
Servlet 手工輸出 HTML前後端分離:Servlet 返回 JSON,前端渲染