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

Servlet 處理表單數據完全指南:GET/POST 統一訪問、參數解析與編碼詳解

     編輯:Java 相關知識

表單數據傳輸基礎

HTML 表單提交時,瀏覽器將數據編碼為 name=value 對,多個參數用 & 連接:

  • GET:參數拼接在 URL 查詢字符串 ?user=Marty+Hall&origin=bwi
  • POST:參數放在請求體,單獨一行發送

編碼規則:字母數字原樣,空格→+,其他字符→%XX(十六進制 ASCII/ISO-8859-1)。

Servlet 自動化解析優勢

傳統 CGI 需手工處理:區分 GET/POST 讀取源、分割 &、解析 =、URL 解碼、處理空值/多值。Servlet 容器自動完成所有步驟,統一提供 HttpServletRequest API。

核心 API 誦解

方法返回類型行為適用場景
getParameter(name)String返回首次出現的值(已解碼),不存在返回 null,空值返回 ""單值參數(90% 場景)
getParameterValues(name)String[]返回所有值數組,不存在返回 null複選框、多選下拉框
getParameterNames()Enumeration<String>返回所有參數名迭代器調試、通用處理、動態表單
getParameterMap()Map<String,String[]>返回參數名→值數組映射(Servlet 2.3+)批量處理、框架綁定

實戰範例:讀取三個參數


public class ThreeParams extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        
        out.println("<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);  // 統一 GET/POST 處理
    }
}

最佳實踐:在 doPost 中調用 doGet,或覆寫 service(),實現雙模式統一處理。

進階範例:顯示所有參數(含空值/多值高亮)


public class ShowParameters extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        
        out.println("<table border=1 align=center>");
        out.println("  <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) {
                String val = values[0];
                if (val.length() == 0) out.print("<i>No Value</i>");
                else out.print(val);
            } else {
                out.println("<ul>");
                for (String v : values) out.println("    <li>" + v + "</li>");
                out.println("  </ul>");
            }
            out.println("</td></tr>");
        }
        out.println("</table>");
    }
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException { doGet(req, resp); }
}

編碼問題終極解決方案

1. 獲取參數前設置字符編碼(POST 必須)


req.setCharacterEncoding("UTF-8");  // 必須在首次 getParameter() 前調用

否則容器按 ISO-8859-1 解碼,中文亂碼不可逆。

2. GET 請求編碼配置(Tomcat 為例)

server.xml 中 <Connector> 添加 URIEncoding="UTF-8",或使用 Filter 統一處理。

特殊場景:文件上傳與原始流讀取

  • multipart/form-data:標準 getParameter 無效,需用 request.getPart() (Servlet 3.0+) 或 Apache Commons FileUpload。
  • 非表單 POST 數據(JSON、XML、自定義協議):用 req.getReader() (字符流) 或 req.getInputStream() (字節流) 直接讀取請求體。注意:讀取流後不能再調用 getParameter。

測試表單範例


<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="$"><br>
  <hr>
  First Name: <input type="text" name="firstName"><br>
  Shipping Address: <textarea name="address" rows=3 cols=40></textarea><br>
  Credit Card: <br>
  <input type="radio" name="cardType" value="Visa">Visa<br>
  <input type="radio" name="cardType" value="Master Card">Master Card<br>
  Card Number: <input type="password" name="cardNum"><br>
  <input type="submit" value="Submit Order">
</form>

密碼欄位使用 type="password",表單用 POST 保護敏感數據。

總結

Servlet 通過 HttpServletRequest 將複雜的 HTTP 表單解析封裝為簡潔 API:統一 GET/POST、自動解碼、多值支持、完整枚舉。掌握 getParameter 族方法、編碼設置時機、特殊場景分流,即可輕鬆應對所有表單處理需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved