轉發的實現web
使用request的getRequestDispatcher( ) 方法獲得對象。 此對象用於封裝一個由路徑所標識的服務器資源,而後用這個對象調用forward() 方法;將請求傳遞給服務器上另外的JSP頁面或者HTML文件。瀏覽器
轉發能夠在多個頁面交互過程當中實現請求數據的共享。緩存
重定向的實現服務器
使用的是response對象的sendRedircet()方法。 執行的結果是客戶端從新向服務器請求一個地址連接,因爲是發送新的請求,於是上次請求中的數據將隨之丟失,這種行爲稱爲重定向。session
重定向能夠理解爲瀏覽器至少提交了兩次請求。併發
轉發與重定向的區別以下:jsp
轉發是服務器行爲,重定向是客戶端行爲url
1.轉發在服務器端完成的;重定向是在客戶端完成的spa
2.轉發的是同一次請求;重定向是兩次不一樣請求orm
3.轉發不會執行轉發後的代碼;重定向會執行重定向以後的代碼
4.轉發地址欄沒有變化;重定向地址欄有變化
5.轉發必須是在同一臺服務器下完成;重定向能夠在不一樣的服務器下完成
404:服務器上找不到請求資源頁面
500:服務器內部錯誤
200 OK 服務器成功處理了請求(這個是咱們見到最多的)
|
|||||||||||||||||||||||
304 Not Modified(未修改)客戶的緩存資源是最新的, 要客戶端使用緩存 |
|||||||||||||||||||||||
404 Not Found 未找到資源 |
|||||||||||||||||||||||
501 Internal Server Error服務器遇到一個錯誤,使其沒法對請求提供服務 |
|||||||||||||||||||||||
頗有用的
|
若是想從一個頁面重定向到另外一個目標頁面,這個時候使用的是response.sendRedirect(「目標地址」);
若是想從一個頁面重定向到另外一個目標頁面,這個時候使用的是轉發操做,
request.getRequestDispatcher("main.jsp").forward(request,response);
重定向和轉發:
01.從客戶端發送的請求數量來看,重定向是向服務器發送了兩次請求。而轉發是服務器內部進的操做,只發送了一次請求,request對象中的數據能夠保留 。
02.從URL顯示的角度來講:重定向這兩次請求都是直接受瀏覽器干預的。也就是說重定向後url地址欄裏看到的地址發生變化了。而轉發是由服務器內部從一個資源頁面定位到另外一個資源頁面,並無通過瀏覽器干預,因此url地址欄沒有發生改變。
結論:要想在request中保存數據,那麼就使用轉發,不然使用重定向。
重定向和轉發有一個重要的不一樣:當使用轉發時,JSP容器將使用一個內部的方法來調用目標頁面,新的頁面繼續處理同一個請求,而瀏覽器將不會知道這個過程。 與之相反,重定向方式的含義是第一個頁面通知瀏覽器發送一個新的頁面請求。由於,當你使用重定向時,瀏覽器中所顯示的URL會變成新頁面的URL, 而當使用轉發時,該URL會保持不變。重定向的速度比轉發慢,由於瀏覽器還得發出一個新的請求。同時,因爲重定向方式產生了一個新的請求,因此通過一次重定向後,request內的對象將沒法使用。
怎麼選擇是重定向仍是轉發呢?一般狀況下轉發更快,並且能保持request內的對象,因此他是第一選擇。可是因爲在轉發以後,瀏覽器中URL仍然指向開始頁面,此時若是重載當前頁面,開始頁面將會被從新調用。若是你不想看到這樣的狀況,則選擇重定向。
轉發和重定向的區別
不要僅僅爲了把變量傳到下一個頁面而使用session做用域,那會無端增大變量的做用域,轉發也許能夠幫助你解決這個問題。
重定向:之前的request中存放的變量所有失效,並進入一個新的request做用域。
轉發:之前的request中存放的變量不會失效,就像把兩個頁面拼到了一塊兒。
重定向過程:
客戶瀏覽器發送http請求----》
web服務器接受後發送302響應要求客戶瀏覽器發送一個新的http請求----》
客戶端瀏覽器接受此響應後再發送一個新的http請求到服務器----》
服務器根據此請求尋找資源併發送給客戶,
它能夠重定向到任意URL,
不能共享request範圍內的數據。
轉發過程:
客戶瀏覽器發送http請求----》
web服務器接受此請求後調用內部的一個方法在容器內部完成請求處理和轉發動做----》
將目標資源發送給客戶,它只能在同一個web應用中使用,能夠共享request範圍內的數據。