轉(zhuǎn)發(fā)與重定向,你至少應(yīng)該知道哪些?

頁面跳轉(zhuǎn)的兩種實現(xiàn)方式:請求轉(zhuǎn)發(fā)和重定向;但是兩者的實現(xiàn)與區(qū)別你知道多少 ?看完這篇就知道答案了

請求轉(zhuǎn)發(fā):

客戶首先發(fā)送一個請求到服務(wù)器端到a.jsp, 發(fā)現(xiàn)匹配的servlet,并指定它去執(zhí)行,當(dāng)這個servlet執(zhí)行完之后,它要調(diào)用getRequestDispacther()方法,把請求轉(zhuǎn)發(fā)給指定的b.jsp,整個流程都是在服務(wù)器端完成的,而且是在同一個請求里面完成的,因此servlet和jsp共享的是同一個request,在servlet a里面放的所有東西,在b中都能取出來,因此,b能把結(jié)果getAttribute()出來,getAttribute()出來后執(zhí)行完把結(jié)果返回給客戶端。整個過程是一個請求,一個響應(yīng)。

request.getRequestDispatcher("/b.jsp").forword(request,response);

image
image.gif

?

重定向:

客戶發(fā)送一個請求到服務(wù)器,服務(wù)器匹配servlet,servlet處理完之后調(diào)用了sendRedirect()方法,立即向客戶端返回這個響應(yīng),響應(yīng)行告訴客戶端你必須要再發(fā)送一個請求,去訪問b.jsp,緊接著客戶端收到這個請求后,立刻發(fā)出一個新的請求,去請求b.jsp,這里兩個請求互不干擾,相互獨立,在前面request里面setAttribute()的任何東西,在后面的request里面都獲得不了??梢姡趕endRedirect()里面是兩個請求,兩個響應(yīng)。(服務(wù)器向瀏覽器發(fā)送一個302狀態(tài)碼以及一個location消息頭,瀏覽器收到請求后會向再次根據(jù)重定向地址發(fā)出請求)

response.sendRedirect("/b.jsp");

image
image.gif

?

區(qū)別:

1、請求次數(shù):重定向是瀏覽器向服務(wù)器發(fā)送一個請求并收到響應(yīng)后再次向一個新地址發(fā)出請求,轉(zhuǎn)發(fā)是服務(wù)器收到請求后為了完成響應(yīng)跳轉(zhuǎn)到一個新的地址;重定向至少請求兩次,轉(zhuǎn)發(fā)請求一次;

2、地址欄不同:重定向地址欄會發(fā)生變化,轉(zhuǎn)發(fā)地址欄不會發(fā)生變化;

3、是否共享數(shù)據(jù):重定向兩次請求不共享數(shù)據(jù),轉(zhuǎn)發(fā)一次請求共享數(shù)據(jù)(在request級別使用信息共享,使用重定向必然出錯);

4、跳轉(zhuǎn)限制:重定向可以跳轉(zhuǎn)到任意URL,轉(zhuǎn)發(fā)只能跳轉(zhuǎn)本站點資源;

5、發(fā)生行為不同:重定向是客戶端行為,轉(zhuǎn)發(fā)是服務(wù)器端行為;

使用:

1、可以利用request的域?qū)ο蟮奶攸c,由源組件向其中存放寫數(shù)據(jù);

2、可以讓用戶訪問到存放在WEB-INF目錄中的目標(biāo)資源;

3、重定向的速度比轉(zhuǎn)發(fā)慢,因為瀏覽器還得發(fā)出一個新的請求,所以如果在使用轉(zhuǎn)發(fā)和重定向都無所謂的時候建議使用轉(zhuǎn)發(fā);

4、因為轉(zhuǎn)發(fā)只能訪問當(dāng)前WEB的應(yīng)用程序,所以不同WEB應(yīng)用程序之間的訪問,特別是要訪問到另外一個WEB站點上的資源的情況,這個時候就只能使用重定向了。

推薦記憶:

我是按照圖片記性,理解。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容