request.getRequestDispatcher()是容器中控制權(quán)的轉(zhuǎn)向,在客戶(hù)端瀏覽器地址欄中不會(huì)顯示出轉(zhuǎn)向后的地址;服務(wù)器內(nèi)部轉(zhuǎn)發(fā),整個(gè)過(guò)程處于同一個(gè)請(qǐng)求當(dāng)中。
response.sendRedirect()則是完全的跳轉(zhuǎn),瀏覽器將會(huì)得到跳轉(zhuǎn)的地址,并重新發(fā)送請(qǐng)求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。不在同一個(gè)請(qǐng)求。重定向,實(shí)際上客戶(hù)端會(huì)向服務(wù)器端發(fā)送兩個(gè)請(qǐng)求。
所以轉(zhuǎn)發(fā)中數(shù)據(jù)的存取可以用request作用域:request.setAttribute(), request.getAttribute(),重定向是取不到request中的數(shù)據(jù)的。只能用session。
forward()更加高效,在可以滿(mǎn)足需要時(shí),盡量使用RequestDispatcher.forward()方法。(思考一下為什么?)
RequestDispatcher是通過(guò)調(diào)用HttpServletRequest對(duì)象的getRequestDispatcher()方法得到的,是屬于請(qǐng)求對(duì)象的方法。
sendRedirect()是HttpServletResponse對(duì)象的方法,即響應(yīng)對(duì)象的方法,既然調(diào)用了響應(yīng)對(duì)象的方法,那就表明整個(gè)請(qǐng)求過(guò)程已經(jīng)結(jié)束了,服務(wù)器開(kāi)始向客戶(hù)端返回執(zhí)行的結(jié)果。
重定向可以跨域訪問(wèn),而轉(zhuǎn)發(fā)是在web服務(wù)器內(nèi)部進(jìn)行的,不能跨域訪問(wèn)。