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

JSP 頁面跳轉兩大方式深度對比:<jsp:forward> vs response.sendRedirect()

     編輯:關於JSP

核心差異速查表

維度<jsp:forward> (伺服器端轉發)response.sendRedirect() (客戶端重導向)
瀏覽器地址列**不變** (仍顯示原 URL)**改變** (顯示新 URL)
請求對象**同一個 request** 傳遞給目標資源**新 request**,原 request 屬性丟失
作用域僅限同一 Web 應用內部資源可重導向到任意絕對/相對 URL (含外部站點)
效能單次網路往返,略快雙次往返 (302 + 新請求),略慢
刷新行為重新執行原請求邏輯 (可能重複提交)重新執行目標 URL (安全,符合 PRG 模式)
代碼執行順序forward 後的代碼**不執行** (控制權移交)sendRedirect 後的代碼**繼續執行** (僅設置響應頭)

實戰驗證代碼

目標頁 turnAfter.html

<html><body><h1>編程入門網:https://www.bianceng.cn</h1></body></html>

方式一:<jsp:forward> — turn_01.jsp

<%@ page contentType="text/html;charset=gbk" %>
<html><body>
<% System.out.println("====forward跳轉之前========="); %>
<jsp:forward page="turnAfter.html"/>
<% System.out.println("====forward跳轉之後========="); %> <!-- 不會輸出 -->
</body></html>

**控制台輸出**:
====forward跳轉之前=========
(無「之後」)

方式二:response.sendRedirect() — turn_02.jsp

<%@ page contentType="text/html;charset=gbk" %>
<html><body>
<% System.out.println("====response跳轉之前========="); %>
<% response.sendRedirect("turnAfter.html"); %>
<% System.out.println("====response跳轉之後========="); %> <!-- 會輸出 -->
</body></html>

**控制台輸出**:
====response跳轉之前=========
====response跳轉之後=========

選型決策樹

  1. 需保留 request 屬性 → <jsp:forward>
  2. 需改變 URL、防止表單重複提交 (PRG) → sendRedirect()
  3. 跳轉外部域名 → sendRedirect()
  4. 內部流程控制、性能敏感 → <jsp:forward>
  5. 權限檢查失敗、登入攔截 → sendRedirect("/login") (配合 return 結束後續代碼)

現代框架中的對應

  • Spring MVC:return "forward:/view" vs return "redirect:/view"
  • Struts 2:<result type="chain"> (Action 鏈,類似 forward) vs <result type="redirect">
  • Servlet 3.0+:request.getRequestDispatcher("/view").forward(req, resp) vs resp.sendRedirect("/view")

最佳實踐:Post-Redirect-Get (PRG) 模式

@WebServlet("/submit")
public class SubmitServlet extends HttpServlet {
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        // 1. 處理業務邏輯
        // 2. 重導向到結果頁,防止 F5 重複提交
        resp.sendRedirect(req.getContextPath() + "/result?status=success");
    }
}

**永遠在 POST 處理完成後使用 sendRedirect**,除非你明確需要 forward 的 request 共享特性。

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