HTML 表單提交時,瀏覽器將數據編碼為 name=value 對,多個參數用 & 連接:
?user=Marty+Hall&origin=bwi編碼規則:字母數字原樣,空格→+,其他字符→%XX(十六進制 ASCII/ISO-8859-1)。
傳統 CGI 需手工處理:區分 GET/POST 讀取源、分割 &、解析 =、URL 解碼、處理空值/多值。Servlet 容器自動完成所有步驟,統一提供 HttpServletRequest 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); }
}
req.setCharacterEncoding("UTF-8"); // 必須在首次 getParameter() 前調用
否則容器按 ISO-8859-1 解碼,中文亂碼不可逆。
server.xml 中 <Connector> 添加 URIEncoding="UTF-8",或使用 Filter 統一處理。
getParameter 無效,需用 request.getPart() (Servlet 3.0+) 或 Apache Commons FileUpload。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 族方法、編碼設置時機、特殊場景分流,即可輕鬆應對所有表單處理需求。