web基礎(請求轉發與重定向、二者區別)


一、重定向

1、重定向的概念

重定向就是在訪問一個Servlet時,沒有得到資源,只能去找另外一個Servlet去獲取資源,狀態碼為302。

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(name = "MyServlet") public class MyServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setStatus(302); response.setHeader("Location", "https://start.firefoxchina.cn/"); } }

在服務器執行該程序的時候,狀態碼被設置為302(重定向),並且告訴了服務器的訪問地址。

在通過Http協議訪問MyServlet時,http地址由http://localhost:8080/MyServlet_war_exploded/abc自動變為火狐的網址。因為狀態碼已經告訴服務器http://localhost:8080/MyServlet_war_exploded/abc這條路走不通了,並且告訴它了一條新路。

 2、重定向的應用

response.sendRedirect(request.getContextPath()+"/ListLinkManServlet");

這行代碼的背景是,處理完添加操作后要顯示全部的信息,顯然,要執行一次查詢,當前servlet已經不能完成此操作,只能把它交給另外一個servlet。但是,以前的request對象中存儲的數據將會全部丟失,因為,這是兩次不同的請求。

 

二、請求轉發

1、request請求轉發

需要建立兩個Servlet:

注意事項:配置文件(兩個Servlet):

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
    <servlet-name>MyServletname</servlet-name>
    <servlet-class>MyServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>MyServletname</servlet-name>
    <url-pattern>/abc</url-pattern>
    </servlet-mapping>
        <servlet>
        <servlet-name>MyServletname1</servlet-name>
        <servlet-class>Servlet2</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MyServletname1</servlet-name>
        <url-pattern>/abc1</url-pattern>
    </servlet-mapping>
</web-app>

定義Servlet1:MyServlet:(直接訪問的是這個Servlet)

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  {
        response.getWriter().write("MyServlet");
        RequestDispatcher dispatcher=request.getRequestDispatcher("/abc1");//獲取轉發器
        dispatcher.forward(request,response);

    }

定義Servlet2:請求轉發后跳轉到此Servlet:

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.getWriter().write("Servlet2");
    }

雖然訪問的是MyServlet的地址,但是顯示的結果表示Servlet2被訪問了,但是地址並不會改變。這也是請求轉發與重定向的區別。

 

 

三、請求轉發和重定向的區別

1、重定向:

 (1)解決了表單重復提交(因為用戶在請求轉發前后訪問的是同一個地址,而重定向執行后地址改變,只能提交一次數據)和servlet無法處理當前請求(如淘寶付款時需要請求轉發到支付寶)的問題。

(2)重定向的時候因為是兩次請求,因此,數據不能存儲在request中,可以存儲在Cookie中

response.sendRedirect(request.getContextPath() + "/admin/products/list.jsp");

服務器返回給客戶端一個響應,告訴客戶端必須重新發送一個請求,兩次請求之間相互獨立。

(3)URL地址會發生改變

2、 請求轉發

 

(1)可以看出,請求轉發只需要發起一次請求,與重定向不同,請求轉發發生在服務器內部。請求轉發后瀏覽器的地址不會改變。

(2)request可以封裝數據

 request.getRequestDispatcher("/admin/products/list.jsp").forward(request,response);

請求轉發的時候,數據可以存儲在request中。上述代碼中可以把request域中的數據請求轉發到list.jsp,request域中的數據可以被jsp取出來,從而實現了數據從Servlet到jsp的流動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM