轉發和重定向【JAVAEE基礎】

8.web系統中資源跳轉

1.跳轉的兩種方式:

   -轉發forward:一次請求
      request.getRequestDispatcher("/b").forward(request,response);
   -重定向redirect:兩次請求
      response.sendRedirect("/prj_servlet_10_war_exploded/b");
      或response.sendRedirect(request.getContextPath()+"/b");
  //將/prj_servlet_10_war_exploded/b 路徑響應給瀏覽器,瀏覽器又向服務器發送了一次全新的請求

2.轉發和重定向的相同點和不同點:

   -相同點:都可以完成資源跳轉
   -不同點:
       * 轉發是request對象觸發的
       * 重定向是response對象觸發的
	   * 轉發是一次請求,瀏覽器地址欄上的地址不會變化。【/a】
	   * 重定向是兩次請求,瀏覽器地址欄上的地址發生變化。【/a,/b】
	   * 重定向的路徑要加webapp的路徑。
	   * 轉發是在本項目內部完成資源跳轉。
	   * 重定向可以完成跨app跳轉。

3.跳轉的下一個資源:

   *可以使web服務器中任一個資源,Servler、html、jsp....

4.轉發和重定向的選擇:【大部分情況下都使用重定向】

   - 若想完成跨app跳轉,必須使用重定向。
   - 若上一個資源在request範圍中存儲了數據,在下一個資源中從request範圍中取出,必須使用轉發。
   - 重定向可以解決瀏覽器的刷新問題。 

5.重定向的原理:

    - response.sendRedirect("/jd/login");
    //將請求路徑/jd/login反饋給瀏覽器,瀏覽器向web服務器發送了一次全新的請求:/jd/login,瀏覽器地址欄顯示的地址是/jd/login

6.點擊一個連接,到網頁最終停下來,這個過程可能是多次請求。

7.重定向可以解決頁面刷新的問題

   resp.sendRedirect(req.getContextPath()+"/success.html");
   頁面刷新的是/success.html
   轉發刷新會重複提交數據。

測試轉發和重定向

AServlet(轉發存入數據/重定向)

package com.chif;

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

public class AServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //向request範圍中存儲數據
        req.setAttribute("username","zhangsan");

        //轉發forward:一次請求
        //req.getRequestDispatcher("/b").forward(req,resp);

        //重定向redirect:兩次請求
        //將/prj_servlet_10_war_exploded/b 路徑響應給瀏覽器,瀏覽器又向服務器發送了一次全新的請求
        resp.sendRedirect("/prj_servlet_10_war_exploded/b");
        //resp.sendRedirect(req.getContextPath()+"/b");
    }
}

BServlet(轉發取出數據)

package com.chif;

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

public class BServlet extends HttpServlet
{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //從request範圍中獲取數據
        Object obj = req.getAttribute("username");
        System.out.println(obj);


    }
}

頁面
在這裏插入圖片描述
測試重定向結果:

頁面跳轉
在這裏插入圖片描述
後臺輸出null
在這裏插入圖片描述
測試轉發結果:

頁面沒有跳轉
在這裏插入圖片描述
後臺輸出
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章