請求轉發:forward(); 重定向:sendRedirect()
來看具體實例:
在HTML頁面寫兩個a鏈接請求,這個就是get請求了,然后建立與請求對應的servlet,頁面代碼如下所示:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>請求轉發實例</title> 6 </head> 7 <body> 8 <h2 style="text-align: center;">Forward測試頁面</h2> 9 <a href="fowardServlet">foward請求</a> 10 <br/></br/> 11 <a href="sendServlet">send重定向</a> 12 </body> 13 </html>
然后建立 請求轉發ForWardServlet,並且在web.xml中配置,這個就不說了
1 package com.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.RequestDispatcher; 6 import javax.servlet.ServletException; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 public class ForwardServlet extends HttpServlet { 12 private static final long serialVersionUID = 1L; 13 14 protected void doGet(HttpServletRequest request, HttpServletResponse response) 15 throws ServletException, IOException { 16 request.setAttribute("forward_name", "abcde"); 17 System.out.println("請求轉發獲取的屬性:" + request.getAttribute("forward_name")); 18 System.out.println("ForwardServlet 的 doGet()方法"); 19 // 轉發請求 20 String path = "testServlet"; 21 RequestDispatcher requestDispatcher = request.getRequestDispatcher("/" + path); 22 requestDispatcher.forward(request, response); 23 } 24 25 }
再建立 請求重定向SendServlet,並且在web.xml中配置,這個也就不說了
1 package com.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 @WebServlet(name = "sendServlet", urlPatterns = "/sendServlet") 12 public class SendServlet extends HttpServlet { 13 private static final long serialVersionUID = 1L; 14 15 protected void doGet(HttpServletRequest request, HttpServletResponse response) 16 throws ServletException, IOException { 17 request.setAttribute("send_name", "abcde"); 18 System.out.println("重定向獲取的屬性:" + request.getAttribute("send_name")); 19 System.out.println("SendServlet 的doGet 方法"); 20 String path = "testServlet"; 21 response.sendRedirect(path); 22 23 } 24 25 }
然后建立path中所提到的 TestServlet
1 package com.servlet; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.annotation.WebServlet; 7 import javax.servlet.http.HttpServlet; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 @WebServlet("/testServlet") 12 public class TestServlet extends HttpServlet { 13 private static final long serialVersionUID = 1L; 14 15 protected void doGet(HttpServletRequest request, HttpServletResponse response) 16 throws ServletException, IOException { 17 // TODO Auto-generated method stub 18 System.out.println("TestServlet 的 doGet 方法"); 19 20 System.out.println("測試請求轉發獲取的屬性:" + request.getAttribute("forward_name")); 21 22 System.out.println("測試重定向獲取的屬性:" + request.getAttribute("send_name")); 23 } 24 25 }
好了,接下來就是看請求轉發和重定向的主要區別:
(1) 請求轉發forward 只有一次請求,而重定向是兩次請求:
(2)請求轉發:在最終的 servlet (TestServlet) 中,request和中轉的那個servlet(ForwardServlet)中的request對象是同一個對象
重定向:在最終的 servlet (TestServlet) 中,request和中轉的那個servlet(SendServlet)中的request對象不是同一個對象
(3)請求轉發:地址欄中的url是初次發起請求的地址
重定向:地址欄中的url是最終響應的的那個地址
(3)請求轉發:僅限於當前web應用內,"/"代表當前web應用的根目錄
請求重定向:可以定向到任何資源,"/"代表當前web站點的根目錄