一,、調(diào)用方式
我們知道,,在servlet中調(diào)用轉(zhuǎn)發(fā)、重定向的語句如下: request.getRequestDispatcher("new.jsp").forward(request, response);//轉(zhuǎn)發(fā)到new.jsp response.sendRedirect("new.jsp");//重定向到new.jsp
在jsp頁面中你也會看到通過下面的方式實(shí)現(xiàn)轉(zhuǎn)發(fā): <jsp:forward page="apage.jsp" />
當(dāng)然也可以在jsp頁面中實(shí)現(xiàn)重定向: <%response.sendRedirect("new.jsp");//重定向到new.jsp%>
二,、本質(zhì)區(qū)別
解釋一
一句話,,轉(zhuǎn)發(fā)是服務(wù)器行為,重定向是客戶端行為,。為什么這樣說呢,,這就要看兩個動作的工作流程:
轉(zhuǎn)發(fā)過程:客戶瀏覽器發(fā)送http請求----》web服務(wù)器接受此請求--》調(diào)用內(nèi)部的一個方法在容器內(nèi)部完成請求處理和轉(zhuǎn)發(fā)動作----》將目標(biāo)資源發(fā)送給客戶;在這里,,轉(zhuǎn)發(fā)的路徑必須是同一個web容器下的url,,其不能轉(zhuǎn)向到其他的web路徑上去,,中間傳遞的是自己的容器內(nèi)的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,,也就是說客戶是感覺不到服務(wù)器做了轉(zhuǎn)發(fā)的,。轉(zhuǎn)發(fā)行為是瀏覽器只做了一次訪問請求。
重定向過程:客戶瀏覽器發(fā)送http請求----》web服務(wù)器接受后發(fā)送302狀態(tài)碼響應(yīng)及對應(yīng)新的location給客戶瀏覽器--》客戶瀏覽器發(fā)現(xiàn)是302響應(yīng),,則自動再發(fā)送一個新的http請求,,請求url是新的location地址----》服務(wù)器根據(jù)此請求尋找資源并發(fā)送給客戶。在這里location可以重定向到任意URL,,既然是瀏覽器重新發(fā)出了請求,,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,,客戶可以觀察到地址的變化的,。重定向行為是瀏覽器做了至少兩次的訪問請求的。
解釋二
重定向,,其實(shí)是兩次request, 第一次,,客戶端request A,服務(wù)器響應(yīng),并response回來,,告訴瀏覽器,,你應(yīng)該去B。這個時候IE可以看到地址變了,,而且歷史的回退按鈕也亮了,。重定向可以訪問自己web應(yīng)用以外的資源。在重定向的過程中,,傳輸?shù)男畔粊G失,。
例子:
請求轉(zhuǎn)發(fā)是服務(wù)器內(nèi)部把對一個request/response的處理權(quán),移交給另外一個 對于客戶端而言,,它只知道自己最早請求的那個A,,而不知道中間的B,甚至C,、D,。 傳輸?shù)男畔⒉粫G失。
例子:
解釋三
假設(shè)你去辦理某個執(zhí)照,,
重定向:你先去了A局,,A局的人說:“這個事情不歸我們管,去B局”,,然后,,你就從A退了出來,自己乘車去了B局,。
轉(zhuǎn)發(fā):你先去了A局,,A局看了以后,,知道這個事情其實(shí)應(yīng)該B局來管,但是他沒有把你退回來,,而是讓你坐一會兒,,自己到后面辦公室聯(lián)系了B的人,讓他們辦好后,,送了過來,。
|