表單是 Web 互動核心。JSP 透過 HttpServletRequest 接收 GET/POST 資料,支援一般欄位、複選框、下拉選單、檔案上傳等多種型態。
| 特性 | GET | POST |
|---|---|---|
| 資料位置 | URL 查詢字串 (?key=val) | HTTP Body |
| 可見性 | 網址列明文可見 | 不直接顯示 |
| 長度限制 | ~2KB (瀏覽器/伺服器限制) | 無實質限制 (可設定) |
| 書籤/分享 | 可直接複製網址 | 不可 |
| 快取 | 可被快取 | 不快取 |
| 安全性 | 不適合敏感資料 | 較適合 (仍需 HTTPS) |
| 適用場景 | 查詢、搜尋、分頁、幂等操作 | 新增、修改、刪除、上傳、登入 |
| 方法 | 回傳型別 | 用途 |
|---|---|---|
getParameter(name) | String | 取得單一值 (多值取第一個) |
getParameterValues(name) | String[] | 取得同名多值 (checkbox、multi-select) |
getParameterNames() | Enumeration<String> | 列舉所有參數名稱 |
getParameterMap() | Map<String, String[]> | 一次取得所有 (適合綁定工具) |
<%@ page contentType="text/html;charset=UTF-8" %>
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>GET 示範</title></head>
<body>
<h2>搜尋結果</h2>
<p>關鍵字:<%= request.getParameter("q") %></p>
<p>分類:<%= request.getParameter("cat") %></p>
</body></html>
測試網址:search.jsp?q=Java&cat=programming
<form action="process.jsp" method="POST">
姓名:<input type="text" name="username" required><br>
性別:<input type="radio" name="gender" value="M">男
<input type="radio" name="gender" value="F">女<br>
興趣:
<input type="checkbox" name="hobby" value="reading">閱讀
<input type="checkbox" name="hobby" value="sport">運動
<input type="checkbox" name="hobby" value="music">音樂<br>
城市:<select name="city">
<option value="TPE">台北</option>
<option value="TAI">台中</option>
<option value="KHH">高雄</option>
</select><br>
<button type="submit">送出</button>
</form>
<%@ page contentType="text/html;charset=UTF-8" %>
<%
// 【關鍵】POST 中文編碼必須在讀取參數前設定
request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>處理結果</title></head>
<body>
<h2>接收資料</h2>
<p>姓名:<%= request.getParameter("username") %></p>
<p>性別:<%= request.getParameter("gender") %></p>
<p>興趣:
<%
String[] hobbies = request.getParameterValues("hobby");
if (hobbies != null) {
for (String h : hobbies) out.print(h + " ");
} else {
out.print("無");
}
%>
</p>
<p>城市:<%= request.getParameter("city") %></p>
<hr>
<h3>所有參數列表</h3>
<table border="1">
<tr><th>名稱</th><th>值</th></tr>
<%
java.util.Enumeration names = request.getParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String[] vals = request.getParameterValues(name);
out.println("<tr><td>" + name + "</td><td>" + String.join(", ", vals) + "</td></tr>");
}
%>
</table>
</body></html>
參考 JSP 檔案上傳完整實作,使用 Commons FileUpload 或 Servlet 3.0 @MultipartConfig。
process.jspprocess.jsp 處理完成後 response.sendRedirect("result.jsp")result.jsp 顯示結果手動驗證繁瑣,建議導入:
@NotNull, @Size, @Pattern 等標註於 JavaBean,搭配 Validator 驗證BeanUtils.populate(bean, request.getParameterMap()) 快速綁定fn:escapeXml() (JSTL) 或 StringEscapeUtils.escapeHtml4()