示例:
//獲取username信息
String username=request.getParameter("username");
//轉(zhuǎn)發(fā)與重定向
if(username.equals("admin")){
//提示用戶已存在斑粱,不能注冊(cè)
request.setAttribute("message","該用戶已存在邀跃,不能注冊(cè)");//添加提示信息,需要在userCreate.jsp頁面中進(jìn)行提示信息展示
request.getRequestDispatcher("userCreate.jsp").forward(request, response);//轉(zhuǎn)法
}else{
//提示注冊(cè)成功
request.setAttribute("message","注冊(cè)成功");
response.sendRedirect("indext.jsp");//重定向
}
轉(zhuǎn)發(fā)與重定向的區(qū)別:
二白修、本質(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ì)被丟失。
例子:
response.sendRedirect("loginsuccess.jsp");
請(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ì)丟失西采。
例子:
RequestDispatcher dis=request.getRequestDispatcher(“l(fā)oginsuccess.jsp”);
dis.forward(request,response);
解釋三
假設(shè)你去辦理某個(gè)執(zhí)照
重定向:你先去了A局凰萨,A局的人說:“這個(gè)事情不歸我們管,去B局”,然后胖眷,你就從A退了出來武通,自己乘車去了B局。
轉(zhuǎn)發(fā):你先去了A局珊搀,A局看了以后冶忱,知道這個(gè)事情其實(shí)應(yīng)該B局來管,但是他沒有把你退回來境析,而是讓你坐一會(huì)兒囚枪,自己
到后面辦公室聯(lián)系了B的人,讓他們辦好后劳淆,送了過來链沼。
最后在來一個(gè)書面解釋加深印象:
1.重定向的執(zhí)行過程:Web服務(wù)器向?yàn)g覽器發(fā)送一個(gè)http響應(yīng)--》瀏覽器接受此響應(yīng)后再發(fā)送一個(gè)新的http請(qǐng)求到服務(wù)器--》
服務(wù)器根據(jù)此請(qǐng)求尋找資源并發(fā)送給瀏覽器。它可以重定向到任意URL沛鸵,不能共享request范圍內(nèi)的數(shù)據(jù)括勺。
2.重定向是在客戶端發(fā)揮作用,通過新的地址實(shí)現(xiàn)頁面轉(zhuǎn)向谒臼。
3.重定向是通過瀏覽器重新請(qǐng)求地址朝刊,在地址欄中可以顯示轉(zhuǎn)向后的地址耀里。
4.轉(zhuǎn)發(fā)過程:Web服務(wù)器調(diào)用內(nèi)部方法在容器內(nèi)部完成請(qǐng)求和轉(zhuǎn)發(fā)動(dòng)作--》將目標(biāo)資源發(fā)送給瀏覽器蜈缤,它只能在同一個(gè)Web應(yīng)用中
使用,可以共享request范圍內(nèi)的數(shù)據(jù)冯挎。
5.轉(zhuǎn)發(fā)是在服務(wù)器端發(fā)揮作用底哥,通過forward()方法將提交信息在多個(gè)頁面間進(jìn)行傳遞。
6.轉(zhuǎn)發(fā)是在服務(wù)器內(nèi)部控制權(quán)的轉(zhuǎn)移房官,客戶端瀏覽器的地址欄不會(huì)顯示出轉(zhuǎn)向后的地址趾徽。