轉發和重定向區別( forward與sendRedirect區別)


SendRedirect Forward
不同的request 不同的對象,但是可以渠道上一個頁面的內容
send後面的語句會繼續執行,除非return Forward後面的語句不會繼續發送給客戶端
速度慢 速度快
需要到客戶端的往返,可以跳轉到任何頁面 服務器內部轉換
地址欄有變化 地址欄沒有變化
可以傳參數,直接寫在URL後面 可以傳參數

 / 代表的是http://127.0.0.0/
<%response.sendRedirect();%>
<form action="/test/ServletToJSP">
<a href="/test/ServletToJSP">test</a>

 / 代表的是 http://127.0.0.1/test
this.getServletContext().getRequestDispatcher
("/servlet_jsp/ServletUseJSP.jsp").forward
(req,resp); 並且只能以 / 開頭
















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站點的根目錄。

  1. RequestDispatcher rd = request.getRequestDispatcher("/index.jsp");  
  2.         rd.forward(request, response);  
  3.   
  4.         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 和頁面刷新實際上都是重定向,所以請求作用域的參數在轉到下一頁面時回失效.


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