Servlet 與 JSP 的數據交互是 Java Web 開發的基石。本文系統梳理 JSP→Servlet 和 Servlet→JSP 兩大方向的傳值機制,深度解析 request、session 作用域的差異,並揭示 URL 映射與轉發重定向的關鍵細節。
<form action="JspServlet?action=toServlet" method="post">
<input name="username" type="text" />
<input type="submit" value="submit">
</form>
Servlet 獲取:request.getParameter("username")
<a href="JspServlet?action=toServlet">點擊</a>
Servlet 獲取:request.getParameter("action") — 注意:URL 必須匹配 web.xml 中的 url-pattern
<%
session.setAttribute("testSession", "Hello session");
request.setAttribute("testRequest", "Hello request"); // 此處無效!
%>
關鍵結論:JSP 內聯代碼設置的 request 屬性,Servlet 無法獲取(因為是不同的 request 對象),只能通過 session 傳遞。
<servlet-mapping>
<servlet-name>JspServlet1</servlet-name>
<url-pattern>/JspServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>JspServlet2</servlet-name>
<url-pattern>/admin/JspServlet</url-pattern>
</servlet-mapping>
不同目錄下的 JSP 訪問同一 Servlet,需註冊多個 url-pattern:
action="JspServlet"action="admin/JspServlet"
// 判斷 session 是否過期
if (request.getSession(false) == null) {
// session 已失效
} else {
// session 有效
HttpSession session = request.getSession();
}
getSession(true)(默認)會自動創建新 session,getSession(false) 不會。
| 特性 | 請求轉發 | 重定向 |
|---|---|---|
| URL 變化 | 不變 | 改變 |
| Request 屬性 | 可傳遞 | 不可傳遞 |
| Session 屬性 | 可傳遞 | 可傳遞 |
| API | RequestDispatcher.forward() | response.sendRedirect() |
| 路徑格式 | 以 / 開頭 | 不以 / 開頭 |
String data = "good well";
request.setAttribute("test", data);
RequestDispatcher rd = request.getRequestDispatcher("/test.jsp");
rd.forward(request, response);
response.sendRedirect("test.jsp"); // 無前導斜線
// 僅能傳遞 session 屬性