請求派發與重定向相同點:
兩者均能指向內部地址,在網頁設計中經常遇到這種場景,如在登錄過程中判斷用戶是否登陸過,如果沒登錄過,則可以指向登錄界面
請求派發與重定向不同點:
1.請求指派只能指派到內部地址,而重定向既可以指派的內部地址又可以指派到外部地址。
2.請求指派指派過程中url不變,用戶無法感知,重定向url會改變
請求派發與重定向實現語法:
1.請求派發
其中url即可以是絕對路徑又可以是相對路徑request.getRequestDispatcher(url).forward(request, response);
2.重定向
之中url如果指向內部地址則只能是相對路徑response.sendRedirect(url);
理論再多不如代碼理解:
我將實現從page1.html,點擊按鈕submit,請求派發或重定向到page2.html的案例實現,如下圖
先看下html的實現
page1代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
body{
background-color: lightgreen;
}
h1{
color: white;
}
</style>
</head>
<body>
<h1>this is page one</h1>
<form action="../first2.do" method="get">
<input type="submit" value="submit">
</form>
</body>
</html>
page2代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
body{
background-color: purple;
}
h1{
color: white;
}
</style>
</head>
<body>
<h1>this is page two</h1>
</body>
</html>
FirstServlet代碼(是已請求派送的方式實現):
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/first.do")
public class FirstServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//請求指派 HttpServletRequest getRequestDispatcher(url)方法
request.getRequestDispatcher("/html/page2.html").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
FirstServlet2代碼(是重定向方式實現,這裏要修改page1.html表單的action屬性action="../first2.do"):
package com.sxt.web.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/first2.do")
public class FirstServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//重定向 HttpServletResponse sendRedirect(url)方法
//response.sendRedirect("http://www.baidu.com");//指向外部地址
response.sendRedirect("html/page2.html"); //指向內部地址,只能用相對路徑
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
個人總結,有不對的地方請指出,多謝指教!
結語:No metter hao far you may fly , don't forgrt where you come from.