jsp中的forward和redirect的區別

2022-04-30 12:09:11 字數 1700 閱讀 4179

**

一、呼叫方式

我們知道,在servlet中呼叫**、重定向的語句如下:

request.getrequestdispatcher("new.jsp").forward(request, response);   //

**到new.jsp

response.sendredirect("new.jsp"); //

重定向到new.jsp

在jsp頁面中你也會看到通過下面的方式實現**:

//jstl

當然也可以在jsp頁面中實現重定向:

<%response.sendredirect("new.jsp"); %> //

重定向到new.jsp

二、本質區別

一句話,**是伺服器行為,重定向是客戶端行為。為什麼這樣說呢,這就要看兩個動作的工作流程:

**過程:客戶瀏覽器傳送http請求——》web伺服器接受此請求——》呼叫內部的乙個方法在容器內部完成請求處理和**動作——》將目標資源傳送給客戶;在這裡,**的路徑必須是同乙個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了**的。**行為是瀏覽器只做了一次訪問請求。

重定向過程:客戶瀏覽器傳送http請求——》web伺服器接受後傳送302狀態碼響應及對應新的location給客戶瀏覽器——》客戶瀏覽器發現是302響應,則自動再傳送乙個新的http請求,請求url是新的location位址——》伺服器根據此請求尋找資源並傳送給客戶。在這裡location可以重定向到任意url,既然是瀏覽器重新發出了請求,則就沒有什麼request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到位址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。

重定向,其實是兩次request

第一次,客戶端request   a,伺服器響應,並response回來,告訴瀏覽器,你應該去b。這個時候ie可以看到位址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的資訊會被丟失。

例子:

response.sendredirect("loginsuccess.jsp");

請求**是伺服器內部把對乙個request/response的處理權,移交給另外乙個

對於客戶端而言,它只知道自己最早請求的那個a,而不知道中間的b,甚至c、d。傳輸的資訊不會丟失。

例子:     

requestdispatcher dis=request.getrequestdispatcher(「loginsuccess.jsp」);

dis.forward(request,response);

假設你去辦理某個執照

重定向:你先去了a局,a局的人說:「這個事情不歸我們管,去b局」,然後,你就從a退了出來,自己乘車去了b局。

**:你先去了a局,a局看了以後,知道這個事情其實應該b局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到後面辦公室聯絡了b的人,讓他們辦好後,送了過來。

jsp中redirect和forward的區別

在網上看到一些帖子,總結了一些區別,可以從以下幾個方面來看 1.從位址列顯示來說 forward是伺服器請求資源,伺服器直接訪問目標位址的url,把那個url的響應內容讀取過來,然後把這些內容 再發給瀏覽器.瀏覽器根本不知道伺服器傳送的內容從 來的,所以它的位址列還是原來的位址.redirect是服...

jsp中forward和redirect的區別

一 呼叫方式 我們知道,在servlet中呼叫 重定向的語句如下 request.getrequestdispatcher new.jsp forward request,response 到new.jsp response.sendredirect new.jsp 重定向到new.jsp 在jsp...

jsp中 forward 與 redirect區別

quote 1.從位址列顯示來說 forward是伺服器請求資源,伺服器直接訪問目標位址的url,把那個url的響應內容讀取過來,然後把這些內容 再發給瀏覽器.瀏覽器根本不知道伺服器傳送的內容從 來的,所以它的位址列還是原來的位址.redirect是服務端根據邏輯,傳送乙個狀態碼,告訴瀏覽器重新去請...