一要门、解釋請(qǐng)求轉(zhuǎn)發(fā)與重定向的原理和效果:
形象解釋:
情景:現(xiàn)在A同學(xué)要申請(qǐng)一個(gè)教師進(jìn)行班級(jí)活動(dòng),有張老師和李主任兩個(gè)人,A學(xué)生會(huì)先去找張老師申請(qǐng)教室。
1.請(qǐng)求轉(zhuǎn)發(fā):
A同學(xué)找到了張老師虏劲,然而張老師沒法決定洽洁,所以張老師去找李主任团秽,李主任同意疯趟,然后張老師通知A同學(xué)申請(qǐng)成功了。
2.重定向:
A同學(xué)去找張老師锡溯,張老師說:“我不管這個(gè)赶舆,你去找李主任吧”。所以A同學(xué)去找李主任祭饭,然后得到了審批芜茵。
在Java Web中,同學(xué)A就是用戶端網(wǎng)頁(yè)甜癞,張老師就是Servlet(服務(wù)器端)夕晓,李主任就是其他資源,例如其他頁(yè)面悠咱。
所以蒸辆,請(qǐng)求轉(zhuǎn)發(fā)其實(shí)是服務(wù)器操作征炼,是有Servlet來負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求并返回結(jié)果。
而重定向是服務(wù)器告訴客戶端要訪問的地址躬贡,然后客戶端去訪問這個(gè)頁(yè)面谆奥,也就是客戶端操作
二、請(qǐng)求轉(zhuǎn)發(fā):
請(qǐng)求轉(zhuǎn)發(fā)能夠保持?jǐn)?shù)據(jù)拂玻,也就是說從 index.jsp (客戶端)發(fā)送的數(shù)據(jù)經(jīng)由Servlet發(fā)送給目標(biāo)頁(yè)面(假設(shè)為thanks.jsp)之后酸些,能從 thanks.jsp 中取出index.jsp中發(fā)送的數(shù)據(jù)。
Servlet保持了客戶端發(fā)來的數(shù)據(jù)檐蚜,使得轉(zhuǎn)發(fā)之后仍然能取出數(shù)據(jù)
因此魄懂,請(qǐng)求轉(zhuǎn)發(fā)在數(shù)據(jù)傳輸效率上要高一些
實(shí)例:
設(shè)置請(qǐng)求轉(zhuǎn)發(fā):
將數(shù)據(jù)發(fā)送到 thanks.jsp:
1.可以看到,頂部的地址欄顯示的Servlet名闯第,而不是 thanks.jsp
這是因?yàn)槭欣酰琒ervlet轉(zhuǎn)發(fā)了請(qǐng)求到了thanks.jsp,然后返回給客戶端咳短,這個(gè)過程對(duì)于客戶端是不可見的填帽,就像學(xué)生A不知道張老師與李主任之間的過程一樣
2.第二點(diǎn):在thanks.jsp中仍然能夠取得在 index.jsp中輸入的數(shù)據(jù),所以Servlet保持了數(shù)據(jù)
三咙好、重定向:
客戶端訪問服務(wù)器之后篡腌,服務(wù)器給客戶端返回一個(gè)信息,客戶端根據(jù)這個(gè)信息再去找目標(biāo)網(wǎng)頁(yè)勾效,所以其實(shí)相當(dāng)于兩次請(qǐng)求嘹悼,因而第一次發(fā)送的數(shù)據(jù)在第二次發(fā)送時(shí)就會(huì)丟失。(就像學(xué)生A對(duì)張老師說的話還得再對(duì)李主任說一遍一樣)
實(shí)例:
這次使用重定向的方式:
response.sendRedirect("/thanks.jsp");
點(diǎn)擊發(fā)送請(qǐng)求葵第,結(jié)果:
結(jié)果分析:
1.這里訪問到了 thanks.jsp绘迁,所以可以確認(rèn)的確重定向到了 thanks.jsp
2.正是因?yàn)閿?shù)據(jù)沒有傳過來合溺,所以全是 null ,在 thanks.jsp中處理數(shù)據(jù)時(shí)就出現(xiàn)了 空指針錯(cuò)誤卒密。
(用之前的例子來說:同學(xué)A從張老師那里轉(zhuǎn)到了李主任,卻忘了自己要說什么 )
四棠赛、使用情景
請(qǐng)求轉(zhuǎn)發(fā):
- 在用戶登錄時(shí)使用請(qǐng)求轉(zhuǎn)發(fā)時(shí)哮奇,維持?jǐn)?shù)據(jù)以進(jìn)行檢測(cè)
重定向:
- 在用戶注銷時(shí)返回主頁(yè)面時(shí),丟失數(shù)據(jù)從而退出當(dāng)前賬戶
講的不錯(cuò)的參考博客:
https://blog.csdn.net/qq_41376740/article/details/81064385
https://blog.csdn.net/bailu66/article/details/6914384