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

Servlet 轉發與重定向深度解析:核心差異、使用場景與經典比喻

     編輯:Java 綜合教學

核心 API 對比

特性請求轉發 RequestDispatcher.forward()重定向 HttpServletResponse.sendRedirect()
操作對象HttpServletRequestHttpServletResponse
瀏覽器地址欄不變變為目標 URL
請求次數1 次(伺服器內部轉發)2 次(瀏覽器發起新請求)
請求/回應對象共享同一組 request/response各自擁有獨立的 request/response
跳轉範圍同一 Web 應用內部資源同站點其他應用、甚至外部站點(絕對 URL)
路徑解析以「/」開頭指 Web 應用根目錄以「/」開頭指站點根目錄
資料傳遞request.setAttribute() 可攜帶預處理結果需透過 Session、Cookie 或 URL 參數
輸出緩衝區調用前不可有實際輸出,否則拋出 IllegalStateException同左,緩衝區內容會被清除

程式碼範例

// 請求轉發
RequestDispatcher rd = request.getRequestDispatcher("/targetServlet");
rd.forward(request, response);

// 重定向
response.sendRedirect(request.getContextPath() + "/targetServlet");

經典比喻:借錢的故事

轉發:你找我借錢,我沒錢,但我幫你去找別人借(借錢動作由我代為執行,你只跟我打交道)。

重定向:你找我借錢,我沒錢,我讓你自己去找別人借(借錢動作由你親自執行,你直接面對新對象)。

選型決策樹

  1. 需在同一 Web 應用內跳轉,且要保留請求屬性(如表單驗證錯誤回顯) → forward。
  2. 跳轉至不同 Web 應用、外部站點,或需改變瀏覽器 URL(如登入成功跳首頁、POST 後重定向防止重複提交) → sendRedirect。
  3. RESTful 風格:POST 處理完業務後 redirect GET,符合 PRG 模式。

常見坑點

  • 在 JSP 中使用 <jsp:forward> 或 response.sendRedirect() 前已有輸出(空白、換行、include 靜態資源) → 拋出 IllegalStateException。
  • forward 後繼續執行後續程式碼 → 應在 forward 後 return。
  • redirect 使用相對路徑未加 contextPath → 導致 404。

總結

轉發是伺服器端的內部協作,重定向是瀏覽器端的雙向互動。理解兩者在請求週期、資料共享、URL 可見性上的本質差異,能讓 Web 應用的導航邏輯更清晰、更健壯。

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