重定向和跳轉(zhuǎn)
1、request.getRequestDispatcher().forward()
? ? 在服務(wù)端起作用,當(dāng)使用forward()時(shí),Servlet傳遞HTTP請求從當(dāng)前的Servlet or JSP到另外一個(gè)Servlet,JSP或HTML文件知押,response共用,參數(shù)自動(dòng)傳遞鹃骂。
? ? 重定向后瀏覽器地址欄URL不變
? ? 請求轉(zhuǎn)發(fā)的過程:
? ? 客戶首先發(fā)送一個(gè)請求到服務(wù)器端台盯,服務(wù)器端發(fā)現(xiàn)匹配的Servlet,并指定去執(zhí)行畏线,當(dāng)這個(gè)Servlet執(zhí)行完成后調(diào)用getRequestDispatcher方法静盅,把請求轉(zhuǎn)發(fā)給指定的對象,整個(gè)過程都是在服務(wù)器端完成象踊,且是在同一個(gè)里面完成的温亲,因經(jīng)Servlet和轉(zhuǎn)發(fā)的對象用的是同一個(gè)request,在Servlet里面放的所有東西棚壁,都可以在轉(zhuǎn)發(fā)的對象中取出來杯矩。
? ? 因此,轉(zhuǎn)發(fā)的對象能把結(jié)果getAttribute()出來袖外。
? ? 整個(gè)過程是一個(gè)請求史隆,一個(gè)響應(yīng)。
? ? forward()無法重定向至有frame的jsp文件曼验,可以重定向至有frame的html文件泌射;
? ? forward()無法在后面帶參數(shù)傳遞,比如Servlet.do?name=yanmw鬓照,可以通過response.setAttribute("name","yanmw");
2熔酷、response.sendRedirect()
? ? 在瀏覽器端工作,當(dāng)使用sendRedirect()時(shí)豺裆,Servlet向?yàn)g覽器傳遞當(dāng)前要跳轉(zhuǎn)地址拒秘,由瀏覽器重新發(fā)送一個(gè)新的請求去訪問要跳轉(zhuǎn)的地址,通過在跳轉(zhuǎn)地址后臺(tái)帶參數(shù)進(jìn)行傳遞臭猜,不能通過response傳遞躺酒。
? ? 跳轉(zhuǎn)后瀏覽器地址欄會(huì)出現(xiàn)重定向頁面的URL。
? ? 重定向的工作原理:
? ? 客戶發(fā)送一個(gè)請求到服務(wù)器蔑歌,服務(wù)器匹配Servlet羹应,Servlet處理完之后調(diào)用了sendRedirect()這個(gè)方法,這個(gè)方法是response的方法次屠,所以园匹,當(dāng)這個(gè)Servlet處理完成 之后雳刺,看到sendRedirect方法,立即向客戶端返回這個(gè)響應(yīng)裸违,告訴客戶端必須再次發(fā)送一個(gè)請求煞烫,去訪問需要重定向的地址。
? ? 客戶端接收到請求后累颂,再次發(fā)送一個(gè)新的請求去請求這個(gè)重定向?qū)ο笾拖辏@兩個(gè)請求互不干擾,相互獨(dú)立紊馏,在前面request里面setAttribute()的任何東西料饥,后面的request都不能獲取。
? ? 在sendRedirect里面是兩個(gè)請求朱监,兩個(gè)響應(yīng)岸啡。
? ? response.sendRedirect()之后,應(yīng)該緊跟一句return,因?yàn)樗峭ㄟ^瀏覽器來做轉(zhuǎn)向的赫编,所以只有在頁面處理完成后巡蘸,才會(huì)有實(shí)際的動(dòng)作。
3擂送、比較
(1)request.getRequestDispatcher.forward()是容器中控制權(quán)的轉(zhuǎn)向悦荒,在客戶端瀏覽器地址欄中不會(huì)顯示出轉(zhuǎn)向后的地址;
(2)response.sendRedirect()則是完全的跳轉(zhuǎn)嘹吨,瀏覽器將會(huì)得到跳轉(zhuǎn)的地址搬味,并重新發(fā)送請求鏈接。這樣蟀拷,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址碰纬。
前者更加高效,在前者可以滿足需要時(shí)问芬,盡量使用RequestDispatcher.forward()方法.
(3)request.getRequestDispatcher.forward()是在本服務(wù)器內(nèi)的跳轉(zhuǎn)悦析;
? ?response.sendRedirect()會(huì)重新向服務(wù)器發(fā)起請求,可跨服務(wù)器訪問此衅,但消耗較大强戴。
(4)sendRedirect()方法不但可以在位于同一個(gè)主機(jī)上的不同Web應(yīng)用程序之間進(jìn)行重定向,而且可以將客戶端重定向到其他服務(wù)器上的Web應(yīng)用程序資源炕柔。而forward()方法只能將請求轉(zhuǎn)發(fā)給同一Web應(yīng)用的組件酌泰。