javaweb之請求的轉發和重定向


1.什么是請求轉發和請求重定向?

請求轉發: xxServlet收到請求,然后直接轉發給yyServlet,然后yyServlet返回給客戶端。整個過程中,客戶端發出一個請求,收到一個響應。

重定向:xxServlet收到請求,然后發出一個響應給客戶端,客戶端立即又發送一個請求訪問xxServlet中給的URL,即yyServlet的路徑,然后yyServlet給客戶端一個響應。整個過程中,客戶端發出兩個請求,收到兩個響應。

2. 請求轉發和請求重定向的實現方法

請求轉發:利用RequestDispather接口中的forward方法實現請求轉發。

請求重定向:利用HttpServletResponse的sendRedirect方法實現請求重定向。

2.1 請求轉發

RequestDispather實例對象是由Servlet引擎創建的,它用於包裝一個要被其他資源調用的資源,(例如Servlet,HTML文件,JSP文件等),並可以通過其中的方法將客戶端的請求轉發給所包裝的資源。

示例代碼如下:

forwardTest.html

<!DOCTYPE html>
<html>
  <head>
    <title>forwardTest.html</title>
	
    <meta name="keywords" content="keyword1,keyword2,keyword3">
    <meta name="description" content="this is my page">
    <meta name="content-type" content="text/html; charset=UTF-8">
    
    <!--<link rel="stylesheet" type="text/css" href="./styles.css">-->

  </head>
  
  <body>
    <a href="http://localhost:8080/MyWebProject/forwardServlet">forward</a>
  </body>
</html>

 forwardServlet.java

package forwardTest;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class forwardServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out=response.getWriter();
		System.out.println("forwardServlet's doGet");
		String path="testServlet";
		//1.調用HttpServletRequest的getRequestDispatcher()方法,調用時需要傳入轉發的地址;
		RequestDispatcher requestDispatcher=request.getRequestDispatcher(path);
		//2.調用HttpServletRequest的forward(request,response)方法進行請求的轉發;
		requestDispatcher.forward(request,response);
	}
}

 testServlet.java

package forwardTest;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class testServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter out=response.getWriter();
		System.out.println("testServlet's doGet");
	}

}

運行forwardTest.html后,點擊超鏈接,控制台輸出:

可以看出, forwardServlet收到客戶端的請求后,調用HttpServletRequest的getRequestDispatcher()方法,利用forward(request,response)方法進行請求轉發,將請求直接轉發給testServlet,testServlet將響應返回給客戶端。達到了請求轉發的目的。

2.2 請求重定向

redirectServlet.java

package forwardTest;

import java.io.IOException;
//import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class redirectServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("redirectServlet's doGet");
		String path="testServlet";
		response.sendRedirect(path);
	}
}

執行請求的重定向,直接調用response.sendRedirect(path)方法,path為重定向的地址。

3.請求的轉發和重定向的區別

本質區別:請求的轉發只發出了一次請求,而重定向則發出了兩次請求。在瀏覽器的開發工具中可以看到請求的次數:

 

具體的區別體現在:

  1.請求的轉發:地址欄是初次發出請求的地址。

     請求的重定向:地址欄不是初次發出請求的地址,為最后響應的地址。

  2.請求轉發:在最終的Servlet中,request和中轉的那個request是同一個對象。

     請求的重定向:在最終的Servlet中,request和中轉的那個request不是同一個對象。

  3.請求轉發:只能轉發給當前web應用的資源。

    請求的重定向:可以重定向到任何資源。

  4.請求的轉發:/代表的是當前web應用的根目錄。

    請求的重定向:/代表的是當前web站點的根目錄。

 

wx搜索“程序員考拉”,專注java領域,一個伴你成長的公眾號!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM