二者比較以下:html
跳轉類型 | 客戶端請求次數 | 服務端響應次數 | URL變化 | 站外跳轉 | 做用域 |
服務器跳轉 | 1 | 1 | 無 | 否 | pageContext、request、session、application |
客戶端跳轉 | 2 | 2 | 有 | 能 | session、application |
請求次數與響應次數服務器
服務端跳轉:客戶端發起一次請求,服務端接收請求後,將結果跳轉到另外一個頁面,做爲這次請求結果返回給客戶端
客戶端跳轉:客戶端發起一次請求,服務端返回這次請求的結果,結果內容是一個URL地址,客戶端拿到此URL,再次發送一次請求,服務端再次響應最終結果給客戶端session
因此,對於服務器跳轉,請求次數和響應次數均是1次,對於 客戶端跳轉,請求次數和響應次數均是2次app
URL是否變化jsp
服務端跳轉:只是服務端內部不斷進行forward,無論進行多少次forward,客戶端是不知情的,服務端將最後的結果返回給客戶端,即完成這次請求。客戶端的URL沒有變化。
客戶端跳轉:客戶端發起兩次請求,URL發生變化(PS:除非閒得蛋疼,兩次請求的URL地址是同樣的)htm
可否進行站外跳轉對象
服務端跳轉:不能進行站外跳轉。服務端請求只能在服務內,將請求響應的結果不斷的跳轉, 使用的都是服務內部的資源。不能跳到其餘服務上去。
客戶端跳轉:能夠。直接跳轉到其餘服務的URL便可blog
做用域生命週期
以jsp的四大做用域,關於做用域詳見地址 http://www.cnblogs.com/mengzhen123/p/5968831.html資源
pageContext:當前頁面
request:當前請求
session:當前會話
application:整個應用。狹義的理解爲application的生命週期爲 服務的開啓到關閉
從上面咱們說請求次數和響應次數就能夠知道,對於客戶端跳轉,pageContext、request發生了改變。由於客戶端URL發生了變化,pageContext即發生了變化,客戶端是發送了是兩次請求,request即發生了變化。因此若是使用客戶端跳轉的時候,共享數據建議存放在session中。
服務端爲何沒有發生變化,咱們從selvet實現服務端跳轉方法forward不難看出, forward方法調用時,帶着request、response參數,即不論服務端進行多少次forward,都是使用同一個request、response。因此pageContext、request做用域並無變化。共享數據放在這兩個做用域的對象中,依然能夠取到。
PS:selvet、Struts二、SpringMVC 實現請求跳轉的方式有差別,可是其本質是同樣的。