三個核心 API
| 方法 | 用途 | 回傳型別 | 典型場景 |
| getParameter(name) | 單值參數 | String | 文本框、單選按鈕、下拉選單 |
| getParameterValues(name) | 多值參數 | String[] | 複選框、多選下拉、同名參數 |
| getParameterNames() | 所有參數名 | Enumeration<String> | 動態表單、除錯列印所有參數 |
完整範例:表單提交與後端接收
HTML 表單
<form action="servlet/Test" method="post">
<table>
<tr><td>姓名:</td><td><input type="text" name="username" /></td></tr>
<tr><td>愛好:</td><td>
<input type="checkbox" name="hobby" value="NBA" />NBA
<input type="checkbox" name="hobby" value="旅遊" />旅遊
<input type="checkbox" name="hobby" value="看書" />看書
</td></tr>
<tr><td><input type="submit" value="提交" /></td></tr>
</table>
</form>
Servlet 處理
@WebServlet("/servlet/Test")
public class Test extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 解決 POST 中文亂碼(必須在讀取參數前)
request.setCharacterEncoding("UTF-8");
// 2. 獲取單值
String username = request.getParameter("username");
System.out.println("username = " + username);
// 3. 獲取多值(複選框)
String[] hobbies = request.getParameterValues("hobby");
if (hobbies != null) {
for (String h : hobbies) {
System.out.println("hobby = " + h);
}
}
// 4. 響應前端
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("姓名:" + username + "<br/>");
out.println("愛好:" + (hobbies != null ? String.join(", ", hobbies) : "無"));
}
}
關鍵細節
- 亂碼處理:POST 必須
request.setCharacterEncoding("UTF-8");GET 需在 Tomcat server.xml 設 URIEncoding="UTF-8"。
- null 安全:
getParameterValues 若無該參數回傳 null,需判斷再遍歷。
- 編碼一致:頁面
<meta charset="UTF-8">、請求編碼、響應編碼、資料庫編碼全鏈路統一。
GET vs POST 差異
| 特性 | GET | POST |
| 參數位置 | URL 查詢字串 | 請求體 |
| 長度限制 | 約 2KB | 無實質限制 |
| 安全性 | 明文可見 | 相對隱蔽 |
| 幂等性 | 是 | 否 |
| 適用場景 | 查詢、分頁、搜尋 | 新增、修改、刪除、上傳 |
最佳實踐
- 統一在
BaseServlet 或 Filter 中設定編碼。
- 使用
BeanUtils.populate() 或框架自動綁定替代手動 getParameter。
- 檔案上傳需用
multipart/form-data + Commons FileUpload 或 Servlet 3.0 @MultipartConfig。