| 特性 | 請求轉發 RequestDispatcher.forward() | 重定向 HttpServletResponse.sendRedirect() |
|---|---|---|
| 操作對象 | HttpServletRequest | HttpServletResponse |
| 瀏覽器地址欄 | 不變 | 變為目標 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");
轉發:你找我借錢,我沒錢,但我幫你去找別人借(借錢動作由我代為執行,你只跟我打交道)。
重定向:你找我借錢,我沒錢,我讓你自己去找別人借(借錢動作由你親自執行,你直接面對新對象)。
<jsp:forward> 或 response.sendRedirect() 前已有輸出(空白、換行、include 靜態資源) → 拋出 IllegalStateException。return。contextPath → 導致 404。轉發是伺服器端的內部協作,重定向是瀏覽器端的雙向互動。理解兩者在請求週期、資料共享、URL 可見性上的本質差異,能讓 Web 應用的導航邏輯更清晰、更健壯。