forward與sendRedirect

     原本覺着網上大神博客那麼多,應該不須要本身這個菜鳥寫什麼了,可是近來發現網上大神可能是不錯,可是坑也是跟着幾何倍數的上漲,就拿forward和sendRed的區別來說,網上一搜一大堆,可是徹底沒有徹底沒有錯誤的講解,在被架構師把exception扔到我面前指着個人鼻子噴了兩回口水後,方知此事仍是要躬行,實踐事後把本身的所得記到這裏,一是本身備忘,二來也但願本身能給廣大猴子們一個正確的參考。java

      基本原理:web

      forward發生在服務端,對客戶端是徹底「透明」的,從一個servlet直接去請求另一個servlet,客戶端神馬都不知道,瀏覽器地址欄天然不會發生變化,仍是第一個請求的url地址;瀏覽器

      sendRedirect要通過客戶端的配合,客戶端發送request1到達服務端,服務端接收request1並生成response1,sendRedirect時服務端會向reponse1頭部寫入須要從新請求的url,客戶端收到reponse1時發現本身被耍了,還得再請求一次,無奈又發了個request2到url,url指定的servlet返回response2到客戶端,客戶端纔算完事,瀏覽器地址欄顯然也會發生改變。服務器

      因而可知,通常狀況下forward是比sendRedirect要快的,爲啥?你當我啥都沒說。。。
架構

      下面說說本次主要驗證的幾點:
url

      1.無論是forward仍是sendRedirect語句執行完後,後面的代碼都會照常執行!之因此不按後面的代碼跑的結果來顯示,本人實驗後發現是由於轉發把後面代碼的執行結果給覆蓋了,這裏有個疑問,爲何不少書籍和資料上都講forward執行後,後面的代碼就不會執行了呢?是由於期間sun對forward進行了改動而這些資料沒有及時更新?
開發

      2.轉發的時候傳值的問題:get

         因爲forward從始至終只有一個request在跑,因此request.getParameter方法能夠獲取客戶端發送請求的時候附帶的數據和forward的url本身在url地址後追加的數據,也能夠在java中使用setAttribute方法寫入數據而後用getAttribute方法把數據讀出來,總之,因爲只有一個request,原先的數據不會丟失,還能夠新添加數據進去;博客

        基於forward的特性,sendRedict就很好理解了,sendRedict的過程當中生了倆request,第二個request到達servlet的時候顯然沒法訪問第一個request中的數據了,這倆就不是一我的兒好嗎?除非你本身處理把第一我的帶的東西複製一份給第二我的帶着,你能夠在sendRedict的url後面直接加上請求的數據,這至關於指定了第二個request的url,servlet天然是能夠獲取到的。
servlet

      3.forward和sendRedict均可以使用相對路徑或絕對路徑進行跳轉!區別在於forward只能跳轉到同一web項目內,而sendRedict能夠隨意跳,另外,跳轉路徑以"/"開頭時,forward表示相對於訪問web項目的根路徑,而sendRedict表示相對於訪問應用服務器的根路徑,我的猜想正是由於forward只能訪問同一web項目,因此java開發者默認"/"爲項目的訪問路徑了;


     因爲代碼比較簡單,就不往上貼了,以上都是筆者我的的一點經驗,歡迎你們回帖討論,同時有錯誤之處歡迎你們批(來)評(打)指(我)正(呀)!

相關文章
相關標籤/搜索