轉載:https://www.cnblogs.com/yinyl/p/8116490.html
請求轉發:
request.getRequestDispatcher().forward();
重定向:
response.sendRedirect();
例如:
請求轉發:
request.getRequestDispatcher("/student_list.jsp").forward(request,response);
重定向:
response.sendRedirect(request.getContextPath + "/student_list.jsp")
轉發過程:客戶端首先發送一個請求到服務器,服務器匹配Servlet,並指定執行。當這個Servlet執行完后,它要調用getRequestDispacther()方法,把請求轉發給指定的student_list.jsp,整個流程都是在服務端完成的,而且是在同一個請求里面完成的,因此Servlet和jsp共享同一個request,在Servlet里面放的所有東西,在student_list.jsp中都能取出來。因此,student_list.jsp能把結果getAttribute()出來,getAttribute()出來后執行完把結果返回給客戶端,整個過程是一個請求,一個響應。
重定向過程:客戶端發送一個請求到服務器端,服務器匹配Servlet,這都和請求轉發一樣。Servlet處理完之后調用了sendRedirect()這個方法,這個方法是response方法。所以,當這個Servlet處理完后,看到response.sendRedirect()方法,立即向客戶端返回個響應,響應行告訴客戶端你必須再重新發送一個請求,去訪問student_list.jsp,緊接着客戶端收到這個請求后,立刻發出一個新的請求,去請求student_list.jsp,在這兩個請求互不干擾、相互獨立,在前面request里面setAttribute()的任何東西,在后面的request里面都獲得不了。因此,在sendRedirect()里面是兩個請求,兩個響應。
Forward是在服務器端的跳轉,就是客戶端一個請求給服務器,服務器直接將請求相關參數的信息原封不動的傳遞到該服務器的其他jsp或Servlet去處理。而sendRedirect()是客戶端的跳轉,服務器會返回客戶端一個響應報頭和新的URL地址,原來的參數信息如果服務器沒有特殊處理就不存在了,瀏覽器會訪問新的URL所指向的Servlet或jsp,這可能不是原來服務器上的webService了。
總結:
1、轉發是在服務器端完成的,重定向是在客戶端發生的;
2、轉發的速度快,重定向速度慢;
3、轉發是同一次請求,重定向是兩次請求;
4、轉發地址欄沒有變化,重定向地址欄有變化;
5、轉發必須是在同一台服務器下完成,重定向可以在不同的服務器下完成。
補充:
原文鏈接:https://blog.csdn.net/fighting_sxw/article/details/79302512
一、請求轉發和請求重定向的區別
請求轉發和請求重定向又分別稱為服務器跳轉和客戶端跳轉
1.1、組件之間可否共享信息不同(本質區別)
當客戶端向服務器發送請求時,服務器收到請求后,會將請求封裝成一個HttpServletRequest對象request,並且所有的請求參數都封裝在request對象中,這個對象時Jsp的內置對象可以直接在Jsp中使用。服務器收到請求后,還需要請求別的頁面,這是就有兩種方式:請求轉發和請求重定向。
所謂請求轉發,是服務器的行為,請求由服務器轉發給另外一個頁面處理,如何轉發,何時轉發,轉發幾次,客戶端是不知道的。請求轉發時,從發送第一次到最后一次請求的過程中,web容器只創建一次request和response對象,新的頁面繼續處理同一個請求。也可以理解為服務器將request對象在頁面之間傳遞。
所謂請求重定向,是客戶端的行為,每次請求重定向都是由客戶端發起的,也就是說重定向一次,就刷新request對象的屬性,之前的request對象的屬性值就失效了。
1.2、瀏覽器地址欄顯示不同(表面區別)
請求轉發之后地址欄的信息並不會有任何的改變。
請求重定向之后地址欄是會改變的,變為跳轉之后的頁面地址。
二、Java實現
2.1 Java中的請求轉發(服務器跳轉)
執行到跳轉語句時就會立刻進行跳轉
Java代碼:
1 request.getRequestDispatcher("success.jsp").forward(request,response);
在jsp頁面中你也會看到通過下面的方式實現轉發:
1 <jsp:forward page="success.jsp" />
2.2 Java中的請求重定向(客戶端跳轉)
- response.sendRedirect("apage.jsp"); 不能傳遞request 范圍的屬性 ,但是可以通過地址重寫的方式向跳轉頁傳遞參數,因為該方法執行完之后就相當於一次http request 的結束,這是服務器會向客戶端發送302 狀態碼和新的url ,告訴客戶端重新發送request 請求到新的url ,然后客戶端照此執行,執行即新的請求響應流程開始,服務器再重新創建HttpServletRequest 對象和HttpServletResponse 對象,此時兩個請求已經不在一個線程了,所以request 和response 對象都不是開始的那個了;
- response.setHeader("refresh","2;URL=index.jsp") 2 秒后跳轉到其他頁面;
- <a href="http://www.baidu.com"> 百度</a> 超鏈接
- 表單提交
三、路徑問題
轉發和重定向的URLString前有加 / 為絕對路徑 反之為相對路徑
3.1絕對路徑
1、重定向的 / 表示:http://服務器ip:端口/
1 response.sendRedirect("/Manager/index.jsp")
生成的地址:web服務器本身地址+參數生成完整的URL 即:http://localhost:8080/Manager/index.jsp
2、請求轉發的 / 表示:http://服務器ip:端口/項目名
1 request.getRequestDispatcher("/index.jsp").forward(request, response);
生成的地址:http://localhost:8080/項目名/index.jsp
重定向是瀏覽器發來的,只知道發到某個服務器,但是不知道發到服務器的哪個project,所以需要自己用代碼聲明; 而請求轉發是服務器某個project內部的轉發,轉來轉去都是在某個project內部,所以不需要手動聲明項目名。
3.2 相對路徑
假設通過表單請求指定的Url資源 action="LoginServlet"
則表單生成的請求地址為:http://localhost:8080/項目名/LoginServlet
- 請求重定向: response.sendRedirect("Manager/index.jsp") 生成相對路徑:http://localhost:8080/項目名/Manager/index.jsp
- 請求轉發:相對路徑情況下生成的完整URL與重定向方法相同。