1. 程式人生 > 其它 >重定向和轉發

重定向和轉發

1.1 重定向

1.1.1重定向的概念

  • 首先客戶瀏覽器傳送http請求,當web伺服器接受後傳送302狀態碼響應及對應新的location給客戶瀏覽器。
  • 客戶瀏覽器發現是302響應,則自動再發送一個新的http請求,請求url是新的location地址,伺服器根據此請求尋找資源併發送給客戶。

1.1.2 重定向的實現

  • 實現重定向需要藉助javax.servlet.http.HttpServletResponse介面中的以下方法:
方法宣告 作用
void sendRedirect(String location) 使用指定的重定向位置URL向客戶端傳送臨時重定向響應

1.1.3 重定向的原理

1.1.4 重定向的特點

  • 重定向之後,瀏覽器位址列的URL會發生改變。
  • 重定向過程中會將前面Request物件銷燬,然後建立一個新的Request物件。
  • 重定向的URL可以是其它專案工程。

1.1.5 程式碼示例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>重定向跳轉</title>
</head>
<body>
<form action="redirectServlet" method="post">
    <input type="submit" value="重定向">
</form>
</body>
</html>

服務端

package cn.guardwhy.demo01;

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("/redirectServlet")
public class RedirectServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("接收到了瀏覽器的請求");
        // 1.重定向,給瀏覽器傳送一個新的位置
        response.sendRedirect(request.getContextPath() + "/test01.html");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

頁面端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>重定向後的頁面</title>
</head>
<body>
    <h3>伺服器重新指定位置後的頁面</h3>
</body>
</html>

執行結果

1.2 轉發

1.2.1 轉發的概念

一個Web元件(Servlet/JSP)將未完成的處理通過容器轉交給另外一個Web元件繼續處理,轉發
的各個元件會共享Request和Response物件。

1.2.2 轉發的實現

  • 繫結資料到Request物件
方法宣告 作用
Object getAttribute(String name) 將指定屬性值作為物件返回,若給定名稱屬性不存在,則返回空值。
void setAttribute(String name,Object o) 在此請求中儲存屬性值。
  • 獲取轉發器物件
方法宣告 作用
RequestDispatcher getRequestDispatcher(String path) 返回一個RequestDispatcher物件,該物件充當位於給定路徑上的資源的包裝器
  • 轉發操作
方法宣告 作用
void forward(ServletRequest request, ServletResponse response) 將請求從一個servlet轉發到伺服器上的另一個資源(Servlet、JSP檔案或HTML檔案)

1.2.3 轉發的特點

  • 轉發之後瀏覽器位址列的URL不會發生改變。
  • 轉發過程中共享Request物件。
  • 轉發的URL不可以是其它專案工程。

1.2.4 轉發的原理

1.2.5 程式碼示例

前端頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>轉發跳轉</title>
</head>
<body>
<form action="forwardServlet01" method="post">
    <input type="submit" value="轉發">
</form>
</body>
</html>

服務端

package cn.guardwhy.demo02;

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("/forwardServlet01")
public class ForwardServlet01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("接收到了瀏覽器的請求");
        // 1.向請求域中新增鍵值對
        request.setAttribute("username", "kobe");
        // 2.轉發,也就是讓Web元件將任務轉交給另外一個Web元件
        request.getRequestDispatcher("/forwardServlet02").forward(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}
package cn.guardwhy.demo02;

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;
import java.io.PrintWriter;

@WebServlet("/forwardServlet02")
public class ForwardServlet02 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("資料轉發過來了");
        // 1.從請求域中取出使用者名稱
        String username = (String) request.getAttribute("username");
        System.out.println("獲取的使用者名稱:" + username);
        // 2.設定編碼
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("從請求域中取出使用者:" + username);
        out.write("<h3>轉發成功...</h3>");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req, resp);
    }
}

執行結果

1.2.6 重定向和轉發的區別

區別 轉發forward() 重定向sendRedirect()
位址列 不會變化 會顯示新的地址
哪裡跳轉 伺服器端 瀏覽器端
請求域中資料 不會丟失 會丟失
根目錄 http://localhost:8080/專案名 http://localhost:8080