forward:請(qǐng)求轉(zhuǎn)發(fā)
redirect: 重定向
1.在給予"/"表示當(dāng)前的路徑是以jsp路徑為根路徑來進(jìn)行請(qǐng)求轉(zhuǎn)發(fā),屬于絕對(duì)路徑。 如果沒有表示當(dāng)前路徑是以當(dāng)前客戶端發(fā)送請(qǐng)求時(shí)的路徑進(jìn)行請(qǐng)求轉(zhuǎn)發(fā),屬于相對(duì)路徑。
2.從這里的請(qǐng)求轉(zhuǎn)發(fā)可以看出,servlet主要負(fù)責(zé)的并不是現(xiàn)實(shí)html代碼,而是為了處理具體的請(qǐng)求轉(zhuǎn)發(fā)。大致方法獲得RequestDisapatcher對(duì)象 然后用其forward方法來進(jìn)行請(qǐng)求轉(zhuǎn)發(fā):
RequestDisapatcher rd=reqest.getRequestDisapatcher();
rd.forward(req,resp); //用這里的方法來進(jìn)行轉(zhuǎn)發(fā)
3.HttpServletResponse 對(duì)象的SendRequest(String location)方法稱作重定向,如果location地址前面加上“/ ”,則表示相對(duì)于servlet容器的根來請(qǐng)求,即http://localhost:8080 ,如果location地址前沒有加上“/”,則表示當(dāng)前請(qǐng)求的URI來尋找地址(就是當(dāng)前的項(xiàng)目目錄中)。
4.RequestDispather的forward(request,response)方法稱為請(qǐng)求轉(zhuǎn)發(fā)。
5.請(qǐng)求轉(zhuǎn)發(fā)和重定向的區(qū)別:
a.請(qǐng)求轉(zhuǎn)發(fā):整個(gè)過程在同一個(gè)請(qǐng)求當(dāng)中。所以在用getParameter的時(shí)候的值可以隨時(shí)拿到。
b. 重定向:實(shí)際上客戶端會(huì)向服務(wù)器發(fā)送兩個(gè)請(qǐng)求。第一個(gè)請(qǐng)求是請(qǐng)求serlvet,第二個(gè)請(qǐng)求是服務(wù)器將結(jié)果發(fā)送到請(qǐng)求頁面。所以getParameter是不可能得到同一個(gè)請(qǐng)求參數(shù)的。所以最總是是用response對(duì)象中的sendRedirect方法來重定向,也即服務(wù)器響應(yīng)對(duì)象來進(jìn)行重定向的.
c.RequestDisapatcher是通過調(diào)用HttpServletRequest對(duì)象的getRequestDisapatcher方法得到的。是屬于請(qǐng)求對(duì)象的方法。
d.sendRedirect方法是屬于HttpServletResposne對(duì)象的方法,即響應(yīng)對(duì)象的方法,既然調(diào)用了響應(yīng)對(duì)象的方法,那就表明整個(gè)請(qǐng)求過程已經(jīng)結(jié)束了,服務(wù)器開始向客戶端返回執(zhí)行的結(jié)果。
6.重定向在firebug中的會(huì)有兩個(gè)請(qǐng)求 而請(qǐng)求轉(zhuǎn)發(fā)只有一個(gè)。本源就是請(qǐng)求個(gè)數(shù)。
前后兩個(gè)頁面 有數(shù)據(jù)傳遞 用請(qǐng)求轉(zhuǎn)發(fā),沒有則用重定向。
比如servlet查詢了數(shù)據(jù)需要在頁面顯示,就用請(qǐng)求轉(zhuǎn)發(fā)。
比如servlet做了update操作跳轉(zhuǎn)到其他頁面,就用重定向。
=======================================================
1.從地址欄顯示來說
forward是服務(wù)器請(qǐng)求資源,服務(wù)器直接訪問目標(biāo)地址的URL,把那個(gè)URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器.瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容從哪里來的,所以它的地址欄還是原來的地址.
redirect是服務(wù)端根據(jù)邏輯,發(fā)送一個(gè)狀態(tài)碼,告訴瀏覽器重新去請(qǐng)求那個(gè)地址.所以地址欄顯示的是新的URL.
2.從數(shù)據(jù)共享來說
forward:轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到的頁面可以共享request里面的數(shù)據(jù).
redirect:不能共享數(shù)據(jù).
3.從運(yùn)用地方來說
forward:一般用于用戶登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊.
redirect:一般用于用戶注銷登陸時(shí)返回主頁面和跳轉(zhuǎn)到其它的網(wǎng)站等.
4.從效率來說
forward:高.
redirect:低.
本質(zhì)區(qū)別
解釋一
一句話,轉(zhuǎn)發(fā)是服務(wù)器行為,重定向是客戶端行為。為什么這樣說呢,這就要看兩個(gè)動(dòng)作的工作流程:
轉(zhuǎn)發(fā)過程:客戶瀏覽器發(fā)送http請(qǐng)求----》web服務(wù)器接受此請(qǐng)求--》調(diào)用內(nèi)部的一個(gè)方法在容器內(nèi)部完成請(qǐng)求處理和轉(zhuǎn)發(fā)動(dòng)作----》將目標(biāo)資源發(fā)送給客戶;在這里,轉(zhuǎn)發(fā)的路徑必須是同一個(gè)web容器下的url,其不能轉(zhuǎn)向到其他的web路徑上去,中間傳遞的是自己的容器內(nèi)的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到服務(wù)器做了轉(zhuǎn)發(fā)的。轉(zhuǎn)發(fā)行為是瀏覽器只做了一次訪問請(qǐng)求。
重定向過程:客戶瀏覽器發(fā)送http請(qǐng)求----》web服務(wù)器接受后發(fā)送302狀態(tài)碼響應(yīng)及對(duì)應(yīng)新的location給客戶瀏覽器--》客戶瀏覽器發(fā)現(xiàn)是302響應(yīng),則自動(dòng)再發(fā)送一個(gè)新的http請(qǐng)求,請(qǐng)求url是新的location地址----》服務(wù)器根據(jù)此請(qǐng)求尋找資源并發(fā)送給客戶。在這里 location可以重定向到任意URL,既然是瀏覽器重新發(fā)出了請(qǐng)求,則就沒有什么request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請(qǐng)求的。
解釋二
重定向,其實(shí)是兩次request,
第一次,客戶端request A,服務(wù)器響應(yīng),并response回來,告訴瀏覽器,你應(yīng)該去B。這個(gè)時(shí)候IE可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應(yīng)用以外的資源。在重定向的過程中,傳輸?shù)男畔?huì)被丟失。
例子:
請(qǐng)求轉(zhuǎn)發(fā)是服務(wù)器內(nèi)部把對(duì)一個(gè)request/response的處理權(quán),移交給另外一個(gè)
對(duì)于客戶端而言,它只知道自己最早請(qǐng)求的那個(gè)A,而不知道中間的B,甚至C、D。 傳輸?shù)男畔⒉粫?huì)丟失。
解釋三:
轉(zhuǎn)發(fā)是服務(wù)器行為,重定向是客戶端行為。
兩者的內(nèi)部機(jī)制有很大的區(qū)別:
1 請(qǐng)求轉(zhuǎn)發(fā)只能將請(qǐng)求轉(zhuǎn)發(fā)給同一個(gè)WEB應(yīng)用中的組件,
而重定向還可以重新定向到同一站點(diǎn)不同應(yīng)用程序中的資源,甚至可以定向到一絕對(duì)的URL。
2 重定向可以看見目標(biāo)頁面的URL,
轉(zhuǎn)發(fā)只能看見第一次訪問的頁面URL,以后的工作都是有服務(wù)器來做的。
3 請(qǐng)求響應(yīng)調(diào)用者和被調(diào)用者之間共享相同的request對(duì)象和response對(duì)象,
重定向調(diào)用者和被調(diào)用者屬于兩個(gè)獨(dú)立訪問請(qǐng)求和響應(yīng)過程。
4 重定向跳轉(zhuǎn)后必須加上return,要不然頁面雖然跳轉(zhuǎn)了,
但是還會(huì)執(zhí)行跳轉(zhuǎn)后面的語句,
轉(zhuǎn)發(fā)是執(zhí)行了跳轉(zhuǎn)頁面,下面的代碼就不會(huì)在執(zhí)行了。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。