關(guān)于forward和redirect的區(qū)別(轉(zhuǎn)載)
forward是服務(wù)器請求資源,服務(wù)器直接訪問目標地址的URL,把那個URL的響應(yīng)內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務(wù)器發(fā)送的內(nèi)容是從哪兒來的,所以它的地址欄中還是原來的地址。還有,轉(zhuǎn)發(fā)是在web應(yīng)用程序之內(nèi)進行的,可以訪問web應(yīng)用程序所設(shè)定的內(nèi)部目錄,像是WEB-INF目錄,只能在Web應(yīng)用程序中進行,不能指定至其它的Web應(yīng)用程序的地址。redirect就是服務(wù)端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數(shù)重新請求,所以session,request參數(shù)都可以獲取。web應(yīng)用程序會要求客戶端瀏覽器重新發(fā)出請求地址,客戶端會重新連接至所指定的地址,因此瀏覽器的地址會出現(xiàn)重新導(dǎo)向的信息,重新導(dǎo)向后的請求由瀏覽器發(fā)出,所以不能訪問Web應(yīng)用程序中的隱藏目錄,像是WEB-INF,重新是由瀏覽器重新要求一個網(wǎng)頁,可以指定至其他的Web應(yīng)用程序地址。
RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的區(qū)別是:前者僅是容器中控制權(quán)的轉(zhuǎn)向,在客戶端瀏覽器地址欄中不會顯示出轉(zhuǎn)向后的地址,他是不會改變Request的值,如果你需要在下一個頁面中能從中獲取新的信息的話,你可以Request.setAttribute()來放置一些標志,這樣從下一個頁面中獲取;后者則是完全的跳轉(zhuǎn),瀏覽器將會得到跳轉(zhuǎn)的地址,并重新發(fā)送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉(zhuǎn)后的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,盡量使用Request Dispatcher.forward()方法,并且,這樣也有助于隱藏實際的鏈接。在有些情況下,比如,需要跳轉(zhuǎn)到一個其它服務(wù)器上的資源,則必須使用 HttpServletResponse.sendRequest()方法。
1、forward與include共亨Request范圍內(nèi)的對象,而redirect則不行,即:如果一個javabean被聲明為request范圍的話,則被forward到的資源也可以訪問這個javabean,而redriect則不行。
2、forward與include基本上都是轉(zhuǎn)發(fā)到context內(nèi)部的資源,而redirect可以重定向到外部的資源,如: req.sendRedriect("http://www.mocuai.com");
posted on 2008-07-02 17:19 liujg 閱讀(195) 評論(0) 編輯 收藏 所屬分類: Java基礎(chǔ)