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

JSP/Servlet 處理表單資料完整指南:GET/POST 統一讀取、多值參數、檔案上傳

     編輯:關於JSP

表單資料傳輸方式

  • GET:參數附加在 URL `?` 後,長度受限 (~2KB),適用查詢、書籤分享。
  • POST:參數在請求主體,無長度限制,適用修改資料、檔案上傳、敏感資訊。

Servlet 統一讀取 API

HttpServletRequest 自動解析 GET/POST,開發者無需區分:

  • getParameter(name):取得第一個值 (String),不存在回傳 null,無值回傳空字串。
  • getParameterValues(name):取得所有值 (String[]),適用 checkbox、multi-select。
  • getParameterNames():取得所有參數名稱 (Enumeration),適合除錯/通用處理。

範例 1:讀取三個固定參數

public class ThreeParams extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();
        out.println("<h1>讀取三個請求參數</h1><ul>");
        out.println("<li>param1: " + req.getParameter("param1") + "</li>");
        out.println("<li>param2: " + req.getParameter("param2") + "</li>");
        out.println("<li>param3: " + req.getParameter("param3") + "</li>");
        out.println("</ul>");
    }
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp); // 同樣處理 POST
    }
}

範例 2:顯示所有參數 (含多值、無值)

public class ShowParameters extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        PrintWriter out = resp.getWriter();
        out.println("<table border=1><tr><th>參數名稱</th><th>參數值</th></tr>");
        Enumeration<String> names = req.getParameterNames();
        while (names.hasMoreElements()) {
            String name = names.nextElement();
            String[] values = req.getParameterValues(name);
            out.print("<tr><td>" + name + "</td><td>");
            if (values.length == 1 && values[0].isEmpty()) {
                out.print("<i>No Value</i>");
            } else if (values.length > 1) {
                out.print("<ul>");
                for (String v : values) out.print("<li>" + v + "</li>");
                out.print("</ul>");
            } else {
                out.print(values[0]);
            }
            out.println("</td></tr>");
        }
        out.println("</table>");
    }
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

測試表單 (POST)

<form action="/servlet/hall.ShowParameters" method="POST">
  Item Number: <input type="text" name="itemNum"><br>
  Quantity: <input type="text" name="quantity"><br>
  Price: <input type="text" name="price" value="100"><br>
  <hr>
  First Name: <input type="text" name="firstName"><br>
  Credit Card: <br>
  <input type="radio" name="cardType" value="Visa"> Visa<br>
  <input type="radio" name="cardType" value="Master"> Master Card<br>
  Card Number: <input type="password" name="cardNum"><br>
  <input type="submit" value="Submit">
</form>

特殊情況:檔案上傳 / 非表單 POST

  • 需使用 request.getInputStream() 或 request.getReader() 讀取原始資料流。
  • 此模式下 不可再呼叫 getParameter(),因為輸入流已被消費。
  • 現代專案請用 Servlet 3.0 @MultipartConfig + request.getPart() 或 Commons FileUpload。

最佳實務

  1. 永遠在 `doPost` 中呼叫 `doGet` (或覆寫 `service`),支援雙模式。
  2. 輸入驗證:白名單過濾、長度限制、型別轉換捕獲異常。
  3. 防止 XSS:輸出至 HTML 前經過 HTML 轉義 (如 JSTL ``、OWASP Encoder)。
  4. CSRF 保護:表單攜帶一次性 Token,伺服端驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved