兩者比較如下:
跳轉類型 | 客戶端請求次數 | 服務端響應次數 | URL變化 | 站外跳轉 | 作用域 |
服務器跳轉 | 1 | 1 | 無 | 否 | pageContext、request、session、application |
客戶端跳轉 | 2 | 2 | 有 | 能 | session、application |
請求次數與響應次數
服務端跳轉:客戶端發起一次請求,服務端接收請求后,將結果跳轉到另一個頁面,作為此次請求結果返回給客戶端
客戶端跳轉:客戶端發起一次請求,服務端返回此次請求的結果,結果內容是一個URL地址,客戶端拿到此URL,再次發送一次請求,服務端再次響應最終結果給客戶端
所以,對於服務器跳轉,請求次數和響應次數均是1次,對於 客戶端跳轉,請求次數和響應次數均是2次
URL是否變化
服務端跳轉:只是服務端內部不斷進行forward,不管進行多少次forward,客戶端是不知情的,服務端將最后的結果返回給客戶端,即完成此次請求。客戶端的URL沒有變化。
客戶端跳轉:客戶端發起兩次請求,URL發生變化(PS:除非閑得蛋疼,兩次請求的URL地址是一樣的)
能否進行站外跳轉
服務端跳轉:不能進行站外跳轉。服務端請求只能在服務內,將請求響應的結果不斷的跳轉, 使用的都是服務內部的資源。不能跳到其他服務上去。
客戶端跳轉:可以。直接跳轉到其他服務的URL即可
作用域
以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、Struts2、SpringMVC 實現請求跳轉的方式有差異,但是其本質是一樣的。