1.從地址欄顯示來說
forward是伺服器請求資源,伺服器直接存取目標地址的URL,把那個URL的響應內容讀取過來,然後把這些內容再發給瀏覽器.瀏覽器根本不知道伺服器發送的內容從哪裡來的,所以它的地址欄還是原來的地址,可以傳遞request屬性,實際上是對RequestDispather介面的封裝.(例如,A訪問B,B訪問C,過程是A-->B-->C,頁面開啟的是C,但是地址欄裡仍是B的地址,Request中有數次請求只有一次,因為forward的可以是內部把請求進行轉向,不用返回用戶端.)
redirect是服務端根據邏輯,發送一個狀態代碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL.(例如,到c頁面時 a--b的參數就得不到了,是一個新的請求)
2.從資料共用來說
forward:轉寄頁面和轉寄到的頁面可以共用
request裡面的資料.redirect:不能共用資料.
3.從運用地方來說
forward:一般用於使用者登陸的時候,根據角色轉寄到相應的模組.
redirect:一般用於使用者登出登陸時返回首頁面和跳轉到其它的網站等.
4.從效率來說
forward:高.
redirect:低.
總結-----------------------------------------------------------------------------------
區別:
<jsp:forward> response.sendRedirect
使用同一個request 是不同的request
forward後的語句不會繼續發送給用戶端 send後的語句會繼續執行,除非return
速度快 速度慢
伺服器內部轉換 需要到用戶端的往返,可以轉到任何頁面
可以傳參數 可以傳參數,直接寫在url後面
地址攔沒有變化 地址攔有變化
應用情境:
forward僅是容器中控制權的轉向,在用戶端瀏覽器地址欄中不會顯示出轉向後的地址;
redirect則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求連結。這樣,從瀏覽器的地址欄中可以看到跳轉後的連結地址。
所以,forward更加高效,在forward可以滿足需要時,盡量使用forward()方法,並且,這樣也有助於隱藏實際的連結。
在有些情況下,比如,需要跳轉到一個其它伺服器上的資源,則必須使用sendRedirect()方法。