Servlet之請求轉發和重定向

Servlet之請求轉發和重定向

簡介:在程序中我們經常需要從一個頁面調到另一個頁面,或者是在維護時爲了不丟用戶,會用到一種頁面跳轉的技術,而請求轉發和重定向就是解決這種問題的方法。

一、請求轉發 RequestDispatcher)

請求轉發是一種內部的轉發,在同一個項目中的url在服務器內部跳轉,可以用請求轉發

 使用方式req.getRequestDispatcher("uri").forward(reqresp);

//   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重定向是 調用responsesendRedirect(url);

2.請求次數:

A請求轉發 瀏覽器只請求一次,地址欄不發生變化

B重定向 瀏覽器會請求兩次,地址欄發生變化,

3.跳轉方式:

A請求轉發 服務器會在內部轉發到請求位置 (由服務器跳轉)

B重定向 服務器在第一次請求時響應給瀏覽器 重定向狀態(狀態碼)和url,瀏覽器根據響應重新請求(由瀏覽器跳轉)

 

4.地址不同:

A請求轉發 只能在同一個項目的服務器中請求轉發的地址

B重定向 不但可以在同一個項目服務器中請求,還可以跨域請求其他的資源地址(這也是重定向唯一的優點)

5.參數不同:

A請求轉發 參數保留( 會調用forward(request, response);將參數傳到轉發的位置)

B重定向  參數丟失(只會給瀏覽器響應對應的狀態和url

 

 

 

發佈了36 篇原創文章 · 獲贊 149 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章