servlet 請求派發與重定向的區別理解

請求派發與重定向相同點:

兩者均能指向內部地址,在網頁設計中經常遇到這種場景,如在登錄過程中判斷用戶是否登陸過,如果沒登錄過,則可以指向登錄界面

請求派發與重定向不同點:

1.請求指派只能指派到內部地址,而重定向既可以指派的內部地址又可以指派到外部地址。

2.請求指派指派過程中url不變,用戶無法感知,重定向url會改變

請求派發與重定向實現語法:

1.請求派發

request.getRequestDispatcher(url).forward(request, response);
其中url即可以是絕對路徑又可以是相對路徑

2.重定向

response.sendRedirect(url);
之中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.



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