1. 程式人生 > >對servlet兩種跳轉方式的深刻探討

對servlet兩種跳轉方式的深刻探討

熟悉web開發的朋友都知道,從servlet跳轉到jsp頁面或者跳轉到另一個servlet,有以下兩種方式可以選擇:
(1)服務端跳轉: request.getRequestDispatcher(“XXXXX”).forward(request, * response);
(2)客戶端跳轉: response.sendRedirect(“XXXXX”);
注:其中XXXXX是你要跳轉到的jsp頁面地址或者servlet的地址】

但是,我相信很多人並沒有對這兩種跳轉方式進行比較深刻的理解。接下來,我將總結我對這兩種跳轉方式區別的理解:
(1)跳轉的原理不同:
第一種跳轉方式是在容器內部實現的同一個Web應用程式的重定向,所以forward方法只能重定向到同一個Web應用程式中的一個資源,重定向後瀏覽器位址列URL不變。
第二種跳轉方式是通過修改HTTP協議的HEADER部分,對瀏覽器下達重定向指令,讓瀏覽器對在location中指定的URL提出請求,使瀏覽器顯示重定向網頁的內容,所以這種方式可以重定向到任何URL,且重定向後瀏覽器URL變成定向後的頁面地址。

(2)引數傳遞不同:
第一種跳轉方式傳遞引數可以通過session、request以及在url中攜帶引數的三種方式來實現。其引數傳遞過程大致為:伺服器在向客戶端傳送資料之前,先將資料輸出到緩衝區,然後將緩衝區中資料傳送給client端。什麼時候將緩衝區裡的資料傳送給client端呢?①當對來自client的request處理完,並把所有資料輸出到緩衝區;②當緩衝區滿;③在程式中呼叫緩衝區的輸出方法out.flush()或response.flushbuffer(),web container才將緩衝區中的資料傳送給client。
第二種跳轉方式傳遞引數的方式只可以通過session和url中攜帶引數兩種方式實現,跳轉到下一個頁面後,無法再獲取又上一個頁面request物件中的資料,即無法使用request.setAttribute來傳遞引數。

(3)對跳轉語句後面的程式碼的處理方式不同:
第一種跳轉方式是伺服器端跳轉,是強制跳轉,不執行其後的程式碼。
第二種跳轉方式中,當程式執行到此句時,是所有程式碼執行完成後再執行跳轉動作,也就是說其後的程式碼有被執行的機會。但是這裡要分兩種情況進行討論:如果要跳到不同主機,跳轉後,此語句後面的語句會繼續執行,如同新開了執行緒,但是對response的操作已經無意義; 如果要跳到相同主機,此語句後面的語句執行完成後才會跳轉。

(4)跳轉路徑不同:
第一種跳轉方式request.getDispatcher(“/XXXXX”).forward(request,response); 轉向web專案的根路徑如:”

http://localhost:8080/projectName/“,所以不帶Web專案名稱。
第二種跳轉方式response.sendRedirect(“/projectName/XXXXX”); 轉向web伺服器的根路徑如:“http://localhost:8080/”,所以要帶Web專案名稱。

【結語】順便說一下,這兩種跳轉方式的原理不一樣,其中第一種跳轉是過濾器無法過濾到的,而第二種跳轉方式是可以過濾到的。

以上內容是本人蔘考以下文章以及自己的思考寫成的,如有錯誤之處,敬請指正。