Web 開發中頁面跳轉看似簡單,但 sendRedirect、forward、include 三者在請求處理、資料共享、瀏覽器行為上有本質差異。本文從原理、代碼、適用場景三維度深度解析。
response.sendRedirect("target.jsp");
setAttribute) 失效,因非同一請求。// Servlet
request.getRequestDispatcher("target.jsp").forward(request, response);
// JSP
<jsp:forward page="target.jsp" />
// Servlet
request.getRequestDispatcher("fragment.jsp").include(request, response);
// JSP
<jsp:include page="fragment.jsp" />
| 特性 | sendRedirect | forward | include |
|---|---|---|---|
| 請求次數 | 2 次 (新請求) | 1 次 | 1 次 |
| 地址列 URL | 改變 | 不變 | 不變 |
| Request 屬性 | 失效 | 保留 | 保留 |
| 執行流控制 | 瀏覽器主導 | 移交不返回 | 執行後返回 |
| 跨 WebApp | 支援 | 不支援 (需 crossContext) | 不支援 |
| 典型用途 | PRG、外部跳轉 | MVC View 渲染 | 頁面片段組合 |
「表單提交後必 Redirect,防重複提交記心裡;
Controller 轉 View 用 Forward,Request 屬性完整留;
Header Footer 共用 Include,頁面組合最輕鬆。」
掌握三者本質差異,能避免常見 Bug:Forward 後仍執行後續代碼、Redirect 丟失 Request 屬性、Include 導致重複輸出 HTML 結構等。