一、重定向
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 {
}
}
執行結果
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項目的資源
- 重定向第一次請求設置的值重定向後不能獲取,轉發時設置的值可以在轉發的資源中獲取
- 完成頁面跳轉功能選擇重定向,多個資源中需要傳遞數據選擇轉發