forward與redirect都是用于引導(dǎo)客戶端的請(qǐng)求到另一個(gè)頁面或另一個(gè)Servlet中的,二者的區(qū)別總結(jié)如下:
1.RequestDispatcher.forward()
服務(wù)端跳轉(zhuǎn),無條件立即執(zhí)行,后面代碼不再執(zhí)行;
轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到的頁面可以共享request里面的數(shù)據(jù);
forward效率高;
通常在servlet中使用;
容器中控制權(quán)的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會(huì)顯示出轉(zhuǎn)向后的地址,地址欄不改變;
無法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同時(shí)forward()無法在后面帶參數(shù)傳遞,比如 servlet?name=frank,這樣不行,可以程序內(nèi)通過response.setAttribute("name",name)來傳至下一個(gè)頁 面;
一般用于用戶登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊
注意:forward動(dòng)作發(fā)生時(shí),如果已經(jīng)有文本被寫入輸出流而且頁面沒有設(shè)置緩沖 ,將拋出IllegalStateException異常。
2.response.sendRedirect()
客戶斷跳轉(zhuǎn),所有代碼執(zhí)行完后再執(zhí)行跳轉(zhuǎn);
用戶請(qǐng)求不被發(fā)送到下一個(gè)頁面,不能共享數(shù)據(jù),必須重新設(shè)置參數(shù);
redirect效率低;
通常在jsp中使用;
完全的跳轉(zhuǎn),瀏覽器將會(huì)得到跳轉(zhuǎn)的地址,并重新發(fā)送請(qǐng)求鏈接,這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址;
可以帶參數(shù)傳遞,比如servlet?name=frank傳至下個(gè)頁面,同時(shí)它可以重定向至不同的主機(jī)上,sendRedirect()可以重定向有frame.的jsp文件;
一般用于用戶注銷登陸時(shí)返回主頁面和跳轉(zhuǎn)到其它的網(wǎng)站等
注意:response.sendRedirect之后,應(yīng)該緊跟一句return;
response.sendRedirect是通過瀏覽器來做轉(zhuǎn)向的,所以只有在頁面處理完成后,才會(huì)有實(shí)際的動(dòng)作。既然你已經(jīng)要做轉(zhuǎn)向了,那么后的輸出還有什么意義呢?而且有可能會(huì)因?yàn)楹竺娴妮敵鰧?dǎo)致轉(zhuǎn)向失敗。
1.RequestDispatcher.forward()
服務(wù)端跳轉(zhuǎn),無條件立即執(zhí)行,后面代碼不再執(zhí)行;
轉(zhuǎn)發(fā)頁面和轉(zhuǎn)發(fā)到的頁面可以共享request里面的數(shù)據(jù);
forward效率高;
通常在servlet中使用;
容器中控制權(quán)的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會(huì)顯示出轉(zhuǎn)向后的地址,地址欄不改變;
無法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同時(shí)forward()無法在后面帶參數(shù)傳遞,比如 servlet?name=frank,這樣不行,可以程序內(nèi)通過response.setAttribute("name",name)來傳至下一個(gè)頁 面;
一般用于用戶登陸的時(shí)候,根據(jù)角色轉(zhuǎn)發(fā)到相應(yīng)的模塊
注意:forward動(dòng)作發(fā)生時(shí),如果已經(jīng)有文本被寫入輸出流而且頁面沒有設(shè)置緩沖 ,將拋出IllegalStateException異常。
2.response.sendRedirect()
客戶斷跳轉(zhuǎn),所有代碼執(zhí)行完后再執(zhí)行跳轉(zhuǎn);
用戶請(qǐng)求不被發(fā)送到下一個(gè)頁面,不能共享數(shù)據(jù),必須重新設(shè)置參數(shù);
redirect效率低;
通常在jsp中使用;
完全的跳轉(zhuǎn),瀏覽器將會(huì)得到跳轉(zhuǎn)的地址,并重新發(fā)送請(qǐng)求鏈接,這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址;
可以帶參數(shù)傳遞,比如servlet?name=frank傳至下個(gè)頁面,同時(shí)它可以重定向至不同的主機(jī)上,sendRedirect()可以重定向有frame.的jsp文件;
一般用于用戶注銷登陸時(shí)返回主頁面和跳轉(zhuǎn)到其它的網(wǎng)站等
注意:response.sendRedirect之后,應(yīng)該緊跟一句return;
response.sendRedirect是通過瀏覽器來做轉(zhuǎn)向的,所以只有在頁面處理完成后,才會(huì)有實(shí)際的動(dòng)作。既然你已經(jīng)要做轉(zhuǎn)向了,那么后的輸出還有什么意義呢?而且有可能會(huì)因?yàn)楹竺娴妮敵鰧?dǎo)致轉(zhuǎn)向失敗。
http://yilin.iteye.com/blog/893998