轉(zhuǎn)發(fā)方式:request.getRequestDispatcher().forward();
          重定向方式:response.sendRedirect();

          下面是HttpServletResponse.sendRedirect方法實(shí)現(xiàn)的請(qǐng)求重定向與RequestDispatcher.forward方法實(shí)現(xiàn)的請(qǐng)求轉(zhuǎn)發(fā)的總結(jié)比較:

          ???? (1RequestDispatcher.forward方法只能將請(qǐng)求轉(zhuǎn)發(fā)給同一個(gè)WEB應(yīng)用中的組件;而HttpServletResponse.sendRedirect 方法不僅可以重定向到當(dāng)前應(yīng)用程序中的其他資源,還可以重定向到同一個(gè)站點(diǎn)上的其他應(yīng)用程序中的資源,甚至是使用絕對(duì)URL重定向到其他站點(diǎn)的資源。如果傳遞給HttpServletResponse.sendRedirect 方法的相對(duì)URL以“/”開頭,它是相對(duì)于整個(gè)WEB站點(diǎn)的根目錄;如果創(chuàng)建RequestDispatcher對(duì)象時(shí)指定的相對(duì)URL以“/”開頭,它是相對(duì)于當(dāng)前WEB應(yīng)用程序的根目錄。

          ??? (2)調(diào)用HttpServletResponse.sendRedirect方法重定向的訪問(wèn)過(guò)程結(jié)束后,瀏覽器地址欄中顯示的URL會(huì)發(fā)生改變,由初始的URL地址變成重定向的目標(biāo)URL;而調(diào)用RequestDispatcher.forward 方法的請(qǐng)求轉(zhuǎn)發(fā)過(guò)程結(jié)束后,瀏覽器地址欄保持初始的URL地址不變。

          ??? (3HttpServletResponse.sendRedirect方法對(duì)瀏覽器的請(qǐng)求直接作出響應(yīng),響應(yīng)的結(jié)果就是告訴瀏覽器去重新發(fā)出對(duì)另外一個(gè)URL的訪問(wèn)請(qǐng)求,這個(gè)過(guò)程好比有個(gè)綽號(hào)叫“瀏覽器”的人寫信找張三借錢,張三回信說(shuō)沒有錢,讓“瀏覽器”去找李四借,并將李四現(xiàn)在的通信地址告訴給了“瀏覽器 ”。于是,“瀏覽器”又按張三提供通信地址給李四寫信借錢,李四收到信后就把錢匯給了“瀏覽器”。可見,“瀏覽器”一共發(fā)出了兩封信和收到了兩次回復(fù), “瀏覽器”也知道他借到的錢出自李四之手。RequestDispatcher.forward方法在服務(wù)器端內(nèi)部將請(qǐng)求轉(zhuǎn)發(fā)給另外一個(gè)資源,瀏覽器只知道發(fā)出了請(qǐng)求并得到了響應(yīng)結(jié)果,并不知道在服務(wù)器程序內(nèi)部發(fā)生了轉(zhuǎn)發(fā)行為。這個(gè)過(guò)程好比綽號(hào)叫“瀏覽器”的人寫信找張三借錢,張三沒有錢,于是張三找李四借了一些錢,甚至還可以加上自己的一些錢,然后再將這些錢匯給了“瀏覽器”。可見,“瀏覽器”只發(fā)出了一封信和收到了一次回復(fù),他只知道從張三那里借到了錢,并不知道有一部分錢出自李四之手。

          ???? (4RequestDispatcher.forward方法的調(diào)用者與被調(diào)用者之間共享相同的request對(duì)象和response對(duì)象,它們屬于同一個(gè)訪問(wèn)請(qǐng)求和響應(yīng)過(guò)程;而HttpServletResponse.sendRedirect方法調(diào)用者與被調(diào)用者使用各自的request對(duì)象和response對(duì)象,它們屬于兩個(gè)獨(dú)立的訪問(wèn)請(qǐng)求和響應(yīng)過(guò)程。對(duì)于同一個(gè)WEB應(yīng)用程序的內(nèi)部資源之間的跳轉(zhuǎn),特別是跳轉(zhuǎn)之前要對(duì)請(qǐng)求進(jìn)行一些前期預(yù)處理,并要使用HttpServletRequest.setAttribute方法傳遞預(yù)處理結(jié)果,那就應(yīng)該使用RequestDispatcher.forward方法。不同WEB應(yīng)用程序之間的重定向,特別是要重定向到另外一個(gè)WEB站點(diǎn)上的資源的情況,都應(yīng)該使用HttpServletResponse.sendRedirect方法。

          ??? (5)無(wú)論是RequestDispatcher.forward方法,還是HttpServletResponse.sendRedirect方法,在調(diào)用它們之前,都不能有內(nèi)容已經(jīng)被實(shí)際輸出到了客戶端。如果緩沖區(qū)中已經(jīng)有了一些內(nèi)容,這些內(nèi)容將被從緩沖區(qū)中清除。
          ??????
          ??????? 怎么選擇是重定向還是轉(zhuǎn)發(fā)呢?通常情況下轉(zhuǎn)發(fā)更快,而且能保持request內(nèi)的對(duì)象,所以他是第一選擇。但是由于在轉(zhuǎn)發(fā)之后,瀏覽器中URL仍然指向開始頁(yè)面,此時(shí)如果重載當(dāng)前頁(yè)面,開始頁(yè)面將會(huì)被重新調(diào)用。如果你不想看到這樣的情況,則選擇轉(zhuǎn)發(fā)。
          不要僅僅為了把變量傳到下一個(gè)頁(yè)面而使用session作用域,那會(huì)無(wú)故增大變量的作用域,轉(zhuǎn)發(fā)也許可以幫助你解決這個(gè)問(wèn)題。?
          ???????? 重定向:以前的request中存放的變量全部失效,并進(jìn)入一個(gè)新的request作用域。?
          ???????? 轉(zhuǎn)發(fā):以前的request中存放的變量不會(huì)失效,就像把兩個(gè)頁(yè)面拼到了一起。

          主站蜘蛛池模板: 浪卡子县| 江油市| 虹口区| 开原市| 道孚县| 贡觉县| 澄江县| 新乐市| 皋兰县| 清镇市| 城固县| 拉孜县| 郯城县| 临泉县| 龙井市| 治多县| 镇平县| 连江县| 嘉峪关市| 韶山市| 赞皇县| 和平县| 凤庆县| 屏南县| 沙雅县| 土默特左旗| 博湖县| 廊坊市| 鄂尔多斯市| 永州市| 永顺县| 雷波县| 扎囊县| 开江县| 万源市| 江口县| 东阳市| 东丽区| 马尔康县| 九江市| 容城县|