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

Java Web 核心:Servlet 轉發、重定向與自動刷新完整指南

     編輯:Java 綜合教學

Servlet 之間的頁面跳轉是 Java Web 基礎中的高頻考點與實戰必備。本文系統講解 轉發、重定向、自動刷新 三大機制的原理、代碼實踐、常見坑點與效果演示。

一、轉發 —— 服務端內部跳轉

核心要點

  • API:RequestDispatcher rd = request.getRequestDispatcher("/path"); rd.forward(request, response);
  • 路徑必須以 / 開頭,可跳轉 Servlet、JSP、HTML、甚至 WEB-INF 下受保護資源。
  • 數據傳遞:request.setAttribute(key, val),目標頁面通過 request.getAttribute() 取值。
  • 禁忌:forward() 前絕不可有任何輸出(含 out.println()、System.out.println()),否則拋 IllegalStateException。

代碼實戰

// ForwardServlet.java
@WebServlet("/servlet/ForwardServlet")
public class ForwardServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String dest = req.getParameter("destination");
        RequestDispatcher rd;
        switch (dest) {
            case "file":  rd = req.getRequestDispatcher("/WEB-INF/web.xml"); break;
            case "jsp":   rd = req.getRequestDispatcher("/page/UploadFile.jsp"); break;
            case "servlet": rd = req.getRequestDispatcher("/servlet/LifeCycleServlet"); break;
            default:
                resp.setContentType("text/html;charset=UTF-8");
                resp.getWriter().println("用法:?destination=jsp|file|servlet");
                return;
        }
        rd.forward(req, resp);
    }
}

Forward 效果圖

二、重定向 —— 客戶端雙請求跳轉

核心要點

  • API:response.sendRedirect(contextPath + "/target");
  • 原理:服務器返回 302 狀態碼 + Location 頭,瀏覽器發起第二次請求。
  • 地址欄 URL 會改變;可跳轉外部域名;request 域對象失效(新請求)。
  • 常用狀態碼:301 永久、302 臨時、307 保持方法。

代碼實戰:文件下載計數器

// RedirectServlet.java
@WebServlet("/servlet/RedirectServlet")
public class RedirectServlet extends HttpServlet {
    private Map counter = new HashMap<>();
    @Override public void init() {
        counter.put("/uploadfile/1.txt",0);
        counter.put("/uploadfile/2.txt",0);
    }
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String file = req.getParameter("filename");
        if (file != null) {
            counter.put(file, counter.get(file)+1);
            resp.sendRedirect(req.getContextPath() + file); // 重定向到實際文件
        } else {
            // 顯示下載統計頁面
            PrintWriter out = resp.getWriter();
            out.println("");
            for (Map.Entry e : counter.entrySet()) {
                out.printf("",
                        e.getKey(), e.getValue(), req.getRequestURI(), e.getKey());
            }
            out.println("
文件次數下載
%s%d下載
"); } } }

Redirect 效果圖

三、自動刷新 —— 定時跳轉或自我刷新

核心 API

response.setHeader("Refresh", "秒數; URL=目標地址");
// 例:5 秒後跳轉到首頁
response.setHeader("Refresh", "5; URL=https://localhost:8080/app/index.jsp");
// 例:3 秒自我刷新
response.setHeader("Refresh", "3");
  • 單位為秒(非毫秒),注意與 JS setTimeout 毫秒區分。
  • 常用於支付結果輪詢、倒計時跳轉、長任務進度刷新。

四、對比總結表

特性ForwardRedirectRefresh
請求次數1 次2 次1 次(含延遲)
URL 變化否是是(跳轉時)
request 域共享是否否
可訪問 WEB-INF是否否
典型場景MVC 分層、權限攔截後跳轉登錄成功、文件下載、跨域跳轉支付輪詢、倒計時、定時刷新

五、避坑指南

  1. Forward 前檢查 response.isCommitted(),防止誤輸出導致異常。
  2. Redirect 時若需攜帶數據,改用 Session、資料庫或 URL 參數傳遞。
  3. Refresh 頭易被瀏覽器緩存/代理干擾,關鍵流程建議改用前端 JS 輪詢或 WebSocket。
  4. 生產環境統一使用 response.encodeRedirectURL() 支持 Session ID 回寫(Cookie 禁用時)。

熟練掌握三種跳轉機制的差異與適用場景,是構建健壯 Java Web 應用的關鍵基本功。

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