轉(zhuǎn)發(fā)和重定向的區(qū)別
區(qū)別一: 重定向時(shí)瀏覽器上的網(wǎng)址改變 轉(zhuǎn)發(fā)是瀏覽器上的網(wǎng)址不變區(qū)別二: 重定向?qū)嶋H上產(chǎn)生了兩次請(qǐng)求轉(zhuǎn)發(fā)只有一次請(qǐng)求重定向: 發(fā)送請(qǐng)求 -->服務(wù)器運(yùn)行-->響應(yīng)請(qǐng)求,返回給瀏覽器一個(gè)新的地址與
區(qū)別一:
重定向時(shí)瀏覽器上的網(wǎng)址改變
轉(zhuǎn)發(fā)是瀏覽器上的網(wǎng)址不變
區(qū)別二:
重定向?qū)嶋H上產(chǎn)生了兩次請(qǐng)求
轉(zhuǎn)發(fā)只有一次請(qǐng)求
重定向:
發(fā)送請(qǐng)求 -->服務(wù)器運(yùn)行-->響應(yīng)請(qǐng)求,返回給瀏覽器一個(gè)新的地址與響應(yīng)碼-->瀏覽器根據(jù)響應(yīng)碼,判定該響應(yīng)為重定向,自動(dòng)發(fā)送一個(gè)新的請(qǐng)求給服務(wù)器,請(qǐng)求地址為之前返回的地址-->服務(wù)器運(yùn)行-->響應(yīng)請(qǐng)求給瀏覽器
轉(zhuǎn)發(fā):
發(fā)送請(qǐng)求 -->服務(wù)器運(yùn)行-->進(jìn)行請(qǐng)求的重新設(shè)置,例如通過(guò)request.setAttribute(name,value)-->根據(jù)轉(zhuǎn)發(fā)的地址,獲取該地址的網(wǎng)頁(yè)-->響應(yīng)請(qǐng)求給瀏覽器
區(qū)別三:
重定向時(shí)的網(wǎng)址可以是任何網(wǎng)址
轉(zhuǎn)發(fā)的網(wǎng)址必須是本站點(diǎn)的網(wǎng)址
詳解:
重定向:以前的request中存放的變量全部失效,并進(jìn)入一個(gè)新的request作用域。
轉(zhuǎn)發(fā):以前的request中存放的變量不會(huì)失效,就像把兩個(gè)頁(yè)面拼到了一起。
正文開(kāi)始:
先是看上去不同,他們的調(diào)用分別如下:
request.getRequestDispatcher("apage.jsp").forward(request, response);//轉(zhuǎn)發(fā)到apage.jsp
response.sendRedirect("apage.jsp");//重定向到apage.jsp
在jsp頁(yè)面中你也會(huì)看到通過(guò)下面的方式實(shí)現(xiàn)轉(zhuǎn)發(fā):
我在初學(xué)jsp的時(shí)候,對(duì)這兩個(gè)概念非常模糊,看別人的例子的時(shí)候,也是一頭霧水,不知道什么時(shí)候該用哪個(gè)。希望下面的解說(shuō)能對(duì)你有所幫助。
提到轉(zhuǎn)發(fā)和重定向就不得不提到request作用域。很多初學(xué)者都知道當(dāng)我們提交一個(gè)表單時(shí),就創(chuàng)建了一個(gè)新的請(qǐng)求。實(shí)際上,當(dāng)我們點(diǎn)擊一個(gè)鏈接時(shí),也創(chuàng)建了一個(gè)新的請(qǐng)求。那么一個(gè)請(qǐng)求的作用于到底有多大呢?例如:
在頁(yè)面a.jsp中有一個(gè)鏈接這是指向b的一個(gè)鏈接,而且還帶了一個(gè)參數(shù)。當(dāng)我們點(diǎn)擊這個(gè)連接的時(shí)候,就產(chǎn)生了一個(gè)請(qǐng)求,為了明確起見(jiàn),我們把它叫做requestA->B。現(xiàn)在,在b.jsp頁(yè)面中我們就可以從這個(gè)請(qǐng)求中獲取信息了。在b.jsp中你可以寫(xiě)入out.println(request.getParameter("id"))進(jìn)行測(cè)試。下面更復(fù)雜一點(diǎn),我們?cè)赽.jsp頁(yè)面中增加下面的語(yǔ)句:
request.setAttribute("name","funcreal");
out.println(request.getAttriblute("name"));//成功顯示了name變量的值。
現(xiàn)在在b.jsp中再增加一個(gè)鏈接:這是指向c的一個(gè)鏈接,而且還帶了一個(gè)參數(shù),當(dāng)我們點(diǎn)擊這個(gè)連接的時(shí)候,將產(chǎn)生一個(gè)新的請(qǐng)求,這時(shí)requestA-B也就安息了,新的請(qǐng)求叫做requestB-C。同樣的道理,在c.jsp中,我們可以訪問(wèn)到的變量只有age,因?yàn)閕d,name這兩個(gè)變量都屬于requestA-B,此時(shí)他已經(jīng)不存在了。下面是源代碼:
a.jsp
<@ page contentType="text/html; charset=GBK" >
<