首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> JSP 程式設計 >> 關於JSP

JSP/Servlet 三種跳轉機制深度解析:sendRedirect、forward、include

     編輯:關於JSP

Web 開發中頁面跳轉看似簡單,但 sendRedirect、forward、include 三者在請求處理、資料共享、瀏覽器行為上有本質差異。本文從原理、代碼、適用場景三維度深度解析。

1. sendRedirect - 客戶端重導向

response.sendRedirect("target.jsp");
  • 機制:伺服器回傳 HTTP 302 狀態碼 + Location 標頭,瀏覽器發起全新請求。
  • 地址列:改變為目標 URL。
  • 資料共享:僅 Session/Application 範圍屬性保留。Request 範圍屬性 (setAttribute) 失效,因非同一請求。
  • 參數:原請求參數若需保留,須手動附加於目標 URL。
  • 適用:跨域跳轉、跳轉至外部網站、表單提交後導向結果頁 (PRG 模式防重複提交)。

2. forward - 伺服器端轉發

// Servlet
request.getRequestDispatcher("target.jsp").forward(request, response);
// JSP
<jsp:forward page="target.jsp" />
  • 機制:容器內部將請求/回應物件直接傳遞給目標資源,同一請求鏈。
  • 地址列:不變,仍顯示原始請求 URL。
  • 資料共享:Request 範圍屬性完整保留 (含 `setAttribute` 物件)。
  • 執行流:當前資源立即終止,控制權移交目標資源,後續代碼不執行。
  • 適用:MVC Controller 處理後轉發至 View、同一 WebApp 內資源協作、隱藏真實資源路徑。

3. include - 伺服器端包含

// Servlet
request.getRequestDispatcher("fragment.jsp").include(request, response);
// JSP
<jsp:include page="fragment.jsp" />
  • 機制:目標資源執行完畢後,控制權返回當前資源繼續執行。
  • 輸出:目標資源輸出直接合併至當前回應流。
  • 資料共享:同 Request 範圍屬性可用。
  • 適用:頁面片段複用 (Header、Footer、Sidebar)、動態組合頁面。

核心差異對照表

特性sendRedirectforwardinclude
請求次數2 次 (新請求)1 次1 次
地址列 URL改變不變不變
Request 屬性失效保留保留
執行流控制瀏覽器主導移交不返回執行後返回
跨 WebApp支援不支援 (需 crossContext)不支援
典型用途PRG、外部跳轉MVC View 渲染頁面片段組合

實戰選型口訣

「表單提交後必 Redirect,防重複提交記心裡;
Controller 轉 View 用 Forward,Request 屬性完整留;
Header Footer 共用 Include,頁面組合最輕鬆。」

掌握三者本質差異,能避免常見 Bug:Forward 後仍執行後續代碼、Redirect 丟失 Request 屬性、Include 導致重複輸出 HTML 結構等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved