Servlet之請求轉發和重定向
簡介:在程序中我們經常需要從一個頁面調到另一個頁面,或者是在維護時爲了不丟用戶,會用到一種頁面跳轉的技術,而請求轉發和重定向就是解決這種問題的方法。
一、請求轉發 (RequestDispatcher)
請求轉發是一種內部的轉發,在同一個項目中的url在服務器內部跳轉,可以用請求轉發
使用方式:req.getRequestDispatcher("uri").forward(req, resp);
// getRequestDispatcher()只是請求的地址(默認從上下文路徑開始)
.forward(request, response) 是將請求的參數帶到轉發的頁面
1、多個Servlet共享一個request對象(重點)
2、一次請求,當轉發結束的時候也就是業務處理完畢的時候request對象會被銷燬
3、地址欄不改變
(所以說瀏覽器只是請求了一次,而服務器會在內部轉發)
4、request對象的作用域(重中之重)
作用域:共享request對象的Servlet
作用域中存取數據:
req.setAttribute(key,value)
req.getAttribute(key)
req.removeAttribute(key)
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDispatcher extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
/* 當頁面有請求到此servlet中時,如果需要請求其他url,則需要使用到請求轉發將某個請求請求轉發到其他url,但前提是同一個項目中的url */
//請求轉發是直接將請求推送到轉發的地址,請求的參數也會被保留,所以瀏覽器只發一次請求
request.getRequestDispatcher("SessionServlet").forward(request, response);
// getRequestDispatcher只是請求的地址默認從上下文路徑開始 .forward(request, response)是請求的參數
return;
// 注意在執行轉發完畢後會繼續執行代碼,但是沒有意義,所以一般在轉發後面加return
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
二、重定向(SendRedirect)
重定向是給瀏覽器響應給瀏覽器一個300-399的狀態碼,和設置的新地址,然後瀏覽器會根據新地址,重新請求一次。 唯一的優點就是可以跨域(訪問其他網站)
使用:resp.sendRedirect("uri");
特點:
地址欄改變
兩次請求,兩個request對象
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SendRedirect extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//設置響應的編碼格式
response.setContentType("text/html");
//設置輸出流響應到瀏覽器
PrintWriter out = response.getWriter();
out.print("頁面已搬家");
//設置重定向(因爲這種操作是瀏覽器做的,所以需要給瀏覽器響應)
response.sendRedirect("https://www.baidu.com");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
總結:
1.調用方式:
A請求轉發 是調用requesgetRequestDispatcher("url).forward(request, response);
B重定向是 調用response。sendRedirect(“url”);
2.請求次數:
A請求轉發 瀏覽器只請求一次,地址欄不發生變化
B重定向 瀏覽器會請求兩次,地址欄發生變化,
3.跳轉方式:
A請求轉發 服務器會在內部轉發到請求位置 (由服務器跳轉)
B重定向 服務器在第一次請求時響應給瀏覽器 重定向狀態(狀態碼)和url,瀏覽器根據響應重新請求(由瀏覽器跳轉)
4.地址不同:
A請求轉發 只能在同一個項目的服務器中請求轉發的地址
B重定向 不但可以在同一個項目服務器中請求,還可以跨域請求其他的資源地址(這也是重定向唯一的優點)
5.參數不同:
A請求轉發 參數保留( 會調用forward(request, response);將參數傳到轉發的位置)
B重定向 參數丟失(只會給瀏覽器響應對應的狀態和url)