SendRedirect | Forward |
---|---|
不同的request | 不同的對象,但是可以渠道上一個頁面的內容 |
send後面的語句會繼續執行,除非return | Forward後面的語句不會繼續發送給客戶端 |
速度慢 | 速度快 |
需要到客戶端的往返,可以跳轉到任何頁面 | 服務器內部轉換 |
地址欄有變化 | 地址欄沒有變化 |
可以傳參數,直接寫在URL後面 | 可以傳參數 |
/ 代表的是http://127.0.0.0/ |
/ 代表的是 http://127.0.0.1/test |
ITeye sendRedirect和forward原理及區別總結
ITeye forward與sendRedirect區別
CSDN forward和sendRedirect的區別
HttpServletResponse.sendRedirect與RequestDispatcher.forward方法都可以實現獲取相應URL資源。
sendRedirect實現請求重定向,forward實現的是請求轉發。
在web服務器內部的處理機制也是不一樣的。
1.forward方法只能轉發給同一個web站點的資源,而sendRedirect方法還可以定位到同一個web站點的其他應用,甚至可以通過傳入絕對路徑定位到別的web站點,這事forward的方法所不能比擬的優勢。
可以看到這兩種方法的用法,如果傳給RequestDispatcher 的參數以"/"開頭,則訪問的是當前web應用的根目錄
加入當前web的根目錄是myweb。如果傳給sendRedirect方法以"/"開頭,訪問的是整個web站點的根目錄。
- RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");
- rd.forward(request, response);
- response.sendRedirect("/index.jsp");
2.forward重定向後,瀏覽器url地址不變,sendRedirect轉發後,瀏覽器url地址變爲目的url地址。
3. 使用forward重定向的過程,是瀏覽器先向目的Servlet發送一次Request請求,然後再服務器端由Servlet再將請求發送到目的url,再由服務器端Servlet返回Response到瀏覽器端。瀏覽器和服務器一次請求響應。
使用sendRedirect轉發的過程,瀏覽器先向目的Servlet發送一次請求,Servlet看到sendRedirect將目的url返回到瀏覽器,瀏覽器再去請求目的url,目的url再返回response到瀏覽器。瀏覽器和服務器兩次請求響應。
4. forward方法的調用者與被調用者之間共享Request和Response
sendRedirect方法由於兩次瀏覽器服務器請求,所以有兩個Request和Response。
如果使用request.setAttribute傳遞一些屬性就需要用forward,如果想要跳轉到別的應用的資源,就需要用sendRedirect。
5.無論是forward方法還是sendRedirect方法調用前面都不能有PrintWriter輸出到客戶端。
forward方法報錯: java.lang.IllegalStateException: Cannot forward after response has been committed
sendRedirect報錯:java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)
----------------------------------------------------------------------------------------------------------------------------------------------
SendRedirect() 與 Forward() 區別
Respose.sendRedirect()
Request.getRequestDispacher().forward()
sendRedirece() Forward()
屬於不同的請求 屬於同一請求
重定向後地址欄發生變化 重定向後地址欄不變
重定向可轉到本WEB程序以外 重定向只能在本WEB程序內
“/”:表示服務器根目錄 “/”:web程序根目錄
網路摘錄:
1.sendRedirect 和forward的區別
簡而言之,sendRedirect()相當於做一次客戶端跳轉,而forward則是服務端跳轉。
sendRedirect是由瀏覽器來做的事情。當調用sendRedirect,服務端返回一個response,裏面包含了跳轉的內容,由瀏覽器獲得後,進行跳轉,我們可以看到瀏覽器中的URL是改變的。而forward則是在服務端直接做的事情,瀏覽器並不知道,這也就是爲什麼forward後瀏覽器的URL還是保持不變的原因。
2.實現頁面跳轉的方法
方式1: <jsp:forward>
jsp:forward 是一種JSP動作,使用語法如下:
CODESTYLE:<jsp:forward page="Relative URL">
在使用此動作時,主頁不可以有任何的輸出,它所起到的作用與SERVLET中使用的RequestDispatcher方法的作用是一致的.這種跳轉是由服務器執行的,因此跳轉的頁面可以放在WEB-INF目錄中,提高程序的安全性.
方式2 response.sendRedirect()
用此方法做跳轉其實是向瀏覽器發送一個特殊的HEADER,然後又瀏覽器來做轉向,裝到指定的頁面.所以用此方法時,瀏覽器上的地址欄裏可以明顯看到地址的變化.這與方式1動作不同,它是由服務器來做轉向的.因此,使用sendRedirect做轉向時,轉向的頁面不能放在WEB-INF下.
方式3 使用頁面自動刷新
代碼如下: CODESTYLE:<meta http-equiv="Refresh" content="秒數";url="跳轉的文件或者地址">
方式4 請求轉發與重定向
jsp:forword 是轉發請求,所以在轉發過程中,請求作用域的參數在轉發頁面是有效的response.sendRedirect 和頁面刷新實際上都是重定向,所以請求作用域的參數在轉到下一頁面時回失效.