forward請求轉發和sendRedirect重定向

目前已經學習了兩種資源跳轉的方式:分別是request對象的請求轉發和response的重定向,那麼這兩者各自有什麼特點以及它們之間的區別是什麼呢?

request請求轉發

一種在服務器內部的資源跳轉方式,舉個例子:瀏覽器向服務器發出請求,服務器中的AServlet收到了請求,但是AServlet無法單獨完成這個請求,如果要完成這個請求,還需要服務器內BServlet的參與,這時候就會用到請求轉發,AServlet執行完自己能執行的部分後跳轉到BServlet中繼續執行,(這中間還涉及到了共享數據,文章後面會將)

請求轉發的特點

  • 瀏覽器地址欄路徑不發生變化:就是說,瀏覽器請求訪問AServlet,Aservlet執行完自己能執行的部分後跳轉到BServlet,在這個過程中瀏覽器地址欄的路徑還是AServlet的路徑,並不會發生改變
  • 只能轉發到當前服務器內部資源中。
  • 轉發是一次請求:從上面的例子可以看出,整個轉發的過程中,無論在服務器內部資源跳轉多少次,瀏覽器只發出過一次請求,而服務請經過多次跳轉處理完瀏覽器的請求後只會做出一次響應

共享數據

上面說到了,AServlet和BServlet一起完成瀏覽器的請求,那麼這兩者之間必定是有數據交互的,因爲AServlet要告訴BServlet自己做了哪些部分(修改了那些數據..),並將這些部分共享給BServlet
說共享數據之前,先說一個概念
域對象:一個有作用範圍的對象,可以在範圍內共享數據
request域:代表一次請求的範圍,即在一個請求的範圍內各個服務器資源可以共享數據。因爲上面說到了請求轉發這個過程是一次請求響應的過程,所以請求轉發過程中的多個資源可以共享數據
  1. 存儲數據,在當前資源中調用此方法(轉發之前調用)void setAttribute(String name, Object o)
    參數:
    String name:給數據起一個名,在後面取出數據用到
    Object o:要共享的數據
  2. 在跳轉後的資源調用此方法,可以達到共享數據的目的:Object getAttribute(String name)
    參數:
    String name:存儲數據時起的名
       還有一個相關的方法:通過鍵來移除鍵值對void removeAttribute(String name)


以上就是request請求轉發的步驟和特點


response重定向

一種資源跳轉的方式,不限於服務器內部,可以跳轉到其他服務器資源(如跳轉到百度)
重定向實現步驟
  1. 設置狀態碼爲302(代表重定向)
  2. 設置響應頭location:response.setHeader("location","目的資源的路徑");
以上是分步實現,後面會說sendRedirect方法來實現,但實際上步驟還是這樣的,只不過把步驟封裝爲一個方法

重定向的原理

  1. 瀏覽器向服務器發出請求,AServlet接收到了這個請求,AServlet表示無法處理服務器的這個請求,但AServlet卻知道BServlet(可以是服務器內部的資源也可以是其他服務器的資源)
  2. 所以AServlet在在響應消息中幹了兩件事情
    1. 設置狀態碼爲302,告訴服務器重定向
    2. 告訴瀏覽器BServlet的路徑,(設置響應頭location爲BServlet的路徑)
  3. 瀏覽器收到了AServlet的響應消息後,根據AServlet給出的location路徑去訪問BServlet

重定向的特點

  • 地址欄發生變化:在資源跳轉的過程中,瀏覽器地址欄會發生變化
  • 重定向可以訪問其他站點(服務器)的資源
  • 重定向是兩次請求。不能使用request對象來共享數據

重定向的簡單方法

調用response的sendRedirect方法,方法中傳遞跳轉資源的路徑
response.sendRedirect("https://www.baidu.com");

關於重定向和請求轉發中資源路徑的寫法,會另外介紹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章