JSP 開發中頻繁需要在頁面間傳遞變數。本文系統整理四種主流模式,附完整代碼範例與適用場景分析,助你精準選型。
適用:少量非敏感資料、書籤可分享、冪等查詢操作。
// a.jsp
<a href="b.jsp?id=1">傳參</a>
或動態生成:<a href="b.jsp?id=<%=var%>">傳參</a>
// b.jsp
<% String val = request.getParameter("id"); %>
<%=val%>
適用:大量資料、敏感資訊(密碼)、非冪等操作(新增/修改/刪除)。
// a.jsp
<form action="b.jsp" method="post">
<input type="text" name="username">
<input type="submit" value="提交">
</form>
// b.jsp
<% String name = request.getParameter("username"); %>
<%=name%>
適用:需在表單提交時攜帶伺服器端產生的狀態值(如 CSRF Token、記錄 ID)。
// a.jsp
<%! int a = 4; %>
<form action="b.jsp" method="post">
<input type="hidden" name="b" value="<%=a%>">
<input type="submit" value="提交">
</form>
// b.jsp (注意:隱藏欄位仍屬 request 參數,用 getParameter)
<% String val = request.getParameter("b"); %>
<%=val%>
糾正:原文示範用request.getAttribute("b")取值,實為錯誤。隱藏欄位屬表單參數,必須用getParameter()。
適用:同一請求鏈內多資源協作(如 Servlet 處理後 forward 至 JSP)、傳遞複雜物件(非字串)。
// Servlet 或 JSP A
request.setAttribute("user", userObject);
request.getRequestDispatcher("b.jsp").forward(request, response);
// b.jsp
<% User u = (User) request.getAttribute("user"); %>
| 場景 | 推薦模式 | 關鍵差異 |
|---|---|---|
| 簡單查詢、可分享連結 | Query String (GET) | URL 可見、長度限制、瀏覽器歷史記錄 |
| 表單提交、敏感資料 | Form POST | URL 不變、資料在 Body、無長度限制 |
| 攜帶伺服器端狀態值 | Hidden Field | 用戶不可見但可檢視原始碼、仍屬參數 |
| 同請求內資源轉發、傳遞物件 | Request Attribute + Forward | 客戶端無感、支援任意 Java 物件、地址欄不變 |
掌握四大模式差異,能避免常見錯誤(如混淆 Parameter/Attribute、GET/POST 語義濫用),構建清晰可維護的頁面流程。