重定向與轉發

一、重定向

1、引入

客戶端請求服務器時,服務器將響應的狀態碼設置爲302,並添加location的響應頭,告知客戶端將location的值作爲新的URL重新確定請求。客戶端收到響應後,根據location的值重新發送請求。

2、示例

方式一:設置狀態碼和location頭

package com.jingxin.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/AServlet")
public class AServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           //設置狀態碼
        response.setStatus(302);
        //設置location頭,建議寫絕對路徑
        response.setHeader("Location", "http://localhost:8080/demo2/index.html");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

方式二:直接設置重定向

package com.jingxin.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/BServlet")
public class BServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.sendRedirect("http://localhost:8080/demo2/index.html");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

}

二、轉發

1、引入

當前請求未完成,服務器需要調用自身的其他資源(Servlet、html、jsp)來處理客戶端的請求,完成響應。(需要多個資源來合作完成請求的處理)

2、分類

  • forward : 會清除之前資源設置的響應緩衝區內容,只保留最後一個資源設置的內容,會保留所有資源設置的響應頭
  • include:合併所有資源設置的響應內容,只保留第一個資源設置的響應頭,忽略其他資源設置的響應頭

資源:指Web項目中的Servlet、html、jsp

3、示例

forward轉發

package com.jingxin.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/CServlet")
public class CServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("CServlet");//最終的響應中會將其擦除
        response.setHeader("CServlet", "CServlet");//最終響應頭中存在
        //獲取請求調度器
        RequestDispatcher dispatcher = request.getRequestDispatcher("/DServlet");
        //轉發請求
        dispatcher.forward(request, response);
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
package com.jingxin.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/DServlet")
public class DServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("DServlet");//最終響應體中存在
        response.setHeader("DServlet", "DServlet");//最終響應頭中存在
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

}

執行結果

這裏寫圖片描述

image


include 包含

package com.jingxin.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/EServlet")
public class EServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("EServlet<br/>");//會將響應內容合併
        response.setHeader("EServlet", "EServlet");//保留響應頭
        //獲取請求調度器
        RequestDispatcher dispatcher = request.getRequestDispatcher("/FServlet");
        //請求包含
        dispatcher.include(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
package com.jingxin.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/FServlet")
public class FServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().append("FServlet");//會合並響應內容
        response.setHeader("FServlet", "FServlet");//會被忽略
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}

執行結果

這裏寫圖片描述

這裏寫圖片描述

三、重定向與轉發的區別

  • 重定向是兩次請求,轉發是一次請求
  • 重定向是瀏覽器地址欄會發生變化,轉發時瀏覽器地址欄不變
  • 重定向可以指定當前Web項目的資源也可以指定其他Web項目的資源,轉發只能指定當前Web項目的資源
  • 重定向第一次請求設置的值重定向後不能獲取,轉發時設置的值可以在轉發的資源中獲取
  • 完成頁面跳轉功能選擇重定向,多個資源中需要傳遞數據選擇轉發
發佈了29 篇原創文章 · 獲贊 18 · 訪問量 8446
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章