Web 開發中頁面跳轉分為客戶端跳轉(重定向)與服務器端跳轉(請求轉發),二者在請求處理、數據傳遞、地址欄表現上有本質區別。Servlet 通過 HttpServletResponse 實現重定向,通過 RequestDispatcher 實現轉發。
| 特性 | 重定向 | 請求轉發 |
|---|---|---|
| API | response.sendRedirect(url) | request.getRequestDispatcher(path).forward(req, resp) |
| 地址欄 | 改變為目標 URL | 保持原請求 URL 不變 |
| 請求對象 | 新請求,原 request 失效 | 同一請求對象傳遞 |
| 數據共享 | 不可直接傳遞 request 屬性 | 可共享 request 域屬性 |
| 跳轉範圍 | 可跳轉至任意 URL(含外部站點) | 僅限當前 Web 應用內部資源 |
| 執行時機 | 服務端響應後,瀏覽器發起新請求 | 服務端內部直接轉發,單次請求完成 |
public class RedirectServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.getSession().setAttribute("name", "趙玉強"); // Session 可跨請求
req.setAttribute("info", "request域數據"); // 重定向後丟失
resp.sendRedirect("get_info.jsp"); // 客戶端跳轉
}
}
目標頁 get_info.jsp 只能獲取 Session 屬性,Request 屬性為 null。
public class ForwardServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setAttribute("info", "request域數據"); // 轉發後保留
req.getRequestDispatcher("get_info.jsp").forward(req, resp);
}
}
目標頁可直接獲取 Request 屬性。