重定向和轉發
阿新 • • 發佈:2021-10-28
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 |