<jsp:forward> 是 JSP 核心動作標籤,實現服務端內部轉發:請求對象保持不變,目標頁面共享同一 Request 上下文,瀏覽器 URL 不變。比 response.sendRedirect() 更高效、更安全(參數不暴露在地址欄)。
<jsp:forward page="{relativeURL | <%= expression %>}" />
<jsp:forward page="{relativeURL | <%= expression %>}">
<jsp:param name="paramName" value="{paramValue | <%= expression %>}" />+
</jsp:forward>
<!-- test1.jsp -->
<jsp:forward page="/test2.jsp" />
<!-- test2.jsp -->
<% out.println("這是 test2.jsp 產生的輸出"); %>
瀏覽器訪問 test1.jsp 直接顯示 test2.jsp 輸出,地址欄仍為 test1.jsp。
<!-- source.jsp -->
<jsp:forward page="/target.jsp">
<jsp:param name="username" value="powerman" />
<jsp:param name="address" value="北京西大街188號" />
</jsp:forward>
<!-- target.jsp -->
<%
String name = request.getParameter("username");
String addr = request.getParameter("address");
out.println("姓名:" + name + "<br/>");
out.println("地址:" + addr + "<br/>");
%>
輸出:
姓名:powerman
地址:北京西大街188號
page="<%= computeTargetPage() %>" 實現運行時路由。out.println() 或模板文本輸出且緩衝區已 flush(),將拋出 IllegalStateException。解決:頁面指令 <%@ page buffer="16kb" autoFlush="false" %> 或確保轉發前無輸出。<jsp:param> 同名參數會覆蓋原請求參數,目標頁面 request.getParameter() 取到新值。ServletContext.getContext() 跨上下文轉發。| 特性 | <jsp:forward> | <jsp:include> | response.sendRedirect() |
|---|---|---|---|
| 請求對象 | 共享 | 共享 | 新請求 |
| 瀏覽器 URL | 不變 | 不變 | 改變 |
| 執行流程 | 控制權永久移交 | 包含片段後返回 | 客戶端跳轉 |
| 跨應用 | 需特殊配置 | 需特殊配置 | 天然支援 |
掌握 <jsp:forward> 及參數傳遞,是構建清晰 MVC 流程、實現業務邏輯分層的基礎技能。