forward/redirect跳轉頁面的區別

轉:http://www.tuicool.com/articles/rMruii
forward方式:request.getRequestDispatcher("/somePage.jsp").forwardrequest, response); redirect方式:response.sendRedirect("/somePage.jsp"); forward是服務器內部重定向,程序收到請求後從新定向到另外一個程序,客戶機並不知道;redirect則是服務器收到請求後發送一個狀態頭給客戶,客戶將再請求一次,這裏多了兩次網絡通訊的來往。固然forward也有缺點,就是forward的頁面的路徑若是是相對路徑就會有些問題了。 forward 會將 request state , bean 等等信息帶往下一個 jsp redirect 是送到 client 端後再一次 request , 因此資料不被保留. 使用 forward 你就能夠用 getAttribute() 來取的前一個 jsp 所放入的 bean 等等資料 在網上看到一些帖子,總結了一些區別,能夠從如下幾個方面來看: 1.從地址欄顯示來講 forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器.瀏覽器根本不知道服務器發送的內容從哪裏來的,因此它的地址欄仍是原來的地址. redirect是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址.因此地址欄顯示的是新的URL.因此redirect等於客戶端向服務器端發出兩次request,同時也接受兩次response。 2.從數據共享來講 forward:轉發頁面和轉發到的頁面能夠共享request裏面的數據. redirect:不能共享數據. redirect不只能夠重定向到當前應用程序的其餘資源,還能夠重定向到同一個站點上的其餘應用程序中的資源,甚至是使用絕對URL重定向到其餘站點的資源. forward,方法只能在同一個Web應用程序內的資源之間轉發請求.forward 是服務器內部的一種操做. redirect 是服務器通知客戶端,讓客戶端從新發起請求. 因此,你能夠說 redirect 是一種間接的請求, 可是你不能說"一個請求是屬於forward仍是redirect " 3.從運用地方來講 forward:通常用於用戶登錄的時候,根據角色轉發到相應的模塊. redirect:通常用於用戶註銷登錄時返回主頁面和跳轉到其它的網站等. 4.從效率來講 forward:高. redirect:低. 5.jsp 語法 <jsp:forward page={"relativeurl" | "<%= expression %>"} /> 或者這樣寫: <jsp:forward page={"relativeurl" | "<%= expression %>"} > <jsp:param name="parametername" value="{parametervalue | <%= expression %>}" />+ </jsp:forward> 6.例子 <jsp:forward page="/servlet/login.jsp" /> <jsp:forward page="/servlet/login.jsp"> <jsp:param name="username" value="jsmith" /> </jsp:forward> 描述 <jsp:forward>標籤從一個jsp文件向另外一個文件傳遞一個包含用戶請求的request對象.<jsp:forward>標籤如下的代碼,將不能執行. 你可以向目標文件傳送參數和值,在這個例子中咱們傳遞的參數名爲username,值爲scott,若是你使用了<jsp:param>標籤的話,目標文件必須是一個動態的文件,可以處理參數. 若是你使用了非緩衝輸出的話,那麼使用<jsp:forward>時就要當心。 若是在你使用<jsp:forward>以前,jsp文件已經有了數據,那麼文件執行就會出錯. 屬性 page="{relativeurl | <%= expression %>}" 這裏是一個表達式或是一個字符串用於說明你將要定向的文件或url.這個文件能夠是jsp,程序段,或者其它可以處理request對象的文件(如asp,cgi,php). <jsp:param name="parametername" value="{parametervalue | <%= expression %>}" />+ 向一個動態文件發送一個或多個參數,這個文件必定是動態文件. 若是你想傳遞多個參數,你能夠在一個jsp文件中使用多個<jsp:param>。name指定參數名,value指定參數值. <jsp:forward>例子 <%@ page contentType="text/html;charset=gb2312" %> <html> <head> <title>test</title> </head> <body> <jsp:forward page="forwardTo.jsp"> <jsp:param name="userName" value="riso"/> </jsp:forward> </body> </html> forwardTo.jsp <%@ page contentType="text/html;charset=gb2312" %> <!--forwardTo.jsp--> <% String useName=request.getParameter("userName"); String outStr= "謝謝光臨!"; outStr+=useName; out.println(outStr); %> redirect的例子: 譬如:client 經過XXX\index.jsp?name=gauss&pwd=123訪問index.jsp,而index.jsp中有< jsp:forward page="login.jsp"/>,則在login.jsp中能夠經過request.getParameter()獲得name和pwd,而<%response.sendRedirect("login.jsp");%>得不到。 -------------------------------------------------------------------------------------------------- 在Java Web開發中,常常會用到跳轉頁面的方法,通常有下面兩種方法。 Java代碼 HttpServletResponse response = new HttpServletResponse(); response.sendRedirect(location); RequestDispatcher rd = new RequestDispatcher(); rd.forward(request, response); 跳轉方式 http://localhost:8080/Test應用 運用forward方法只能重定向到同一個Web應用程序中的一個資源。而sendRedirect方法可讓你重定向到任何URL。 表單form的action= 「/uu 「;sendRedirect( 「/uu 「);表示相對於服務器根路徑。如http://localhost:8080/Test應用(則提交至http://localhost:8080/uu); Forward代碼中的 「/uu 「則表明相對與WEB應用的路徑。如http://localhost:8080/Test應用(則提交至http://localhost:8080/Test/uu); (運用RequestDispatcher接口的Forward)方法 forward()沒法重定向至有frame的jsp文件,能夠重定向至有frame的html文件, 同時forward()沒法在後面帶參數傳遞,好比servlet?name=frank,這樣不行,能夠程序內經過response.setAttribute( 「name 「,name)來傳至下一個頁面. 重定向後瀏覽器地址欄URL不變. 只有在客戶端沒有輸出時才能夠調用forward方法。若是當前頁面的緩衝區(buffer)不是空的,那麼你在調用forward方法前必須先清空緩衝區。 「/ 「表明相對與web應用路徑 RequestDispatcher rd = request.getRequestDispatcher( 「/ooo 「); rd.forward(request, response);提交至http://localhost:8080/Test/ooo RequestDispatcher rd = getServletContext().getRequestDispatcher( 「/ooo 「); rd.forward(request, response);提交至http://localhost:8080/Test/ooo RequestDispatcher rd =getServletContext().getNamedDispatcher( 「TestServlet 「);(TestServlet爲一個 <servlet-name> ) rd.forward(request, response);提交至名爲TestServlet的servlet 若是在 <jsp:forward> 以前有不少輸出,前面的輸出已使緩衝區滿,將自動輸出到客戶端,那麼該語句將不起做用,這一點應該特別注意。 另外要注意:它不能改變瀏覽器地址,刷新的話會致使重複提交 從http://localhost:8080/Test/gw/page.jsp中轉發 <jsp:forward page= 「OtherPage.jsp 「/> 在JSP頁面被解析後轉換成pageContext.forward( 「OtherPage.jsp [...] -------------------------------------------------------------------------------------------------- 清空當前緩存: 在以前撰寫JSP的例子中,實用了out這個對象,這個對象您不用事先宣告,就能夠在JSP網頁中使用,這是JSP所提供的隱含對象 (Implicit Object),在轉譯爲Servlet以後,out會轉換爲對應於javax.servlet.jsp.JspWriter型態的對象。 JspWriter直接繼承自java.io.Writer,您可使用println()、print()方法將指定的數據以字符的方式傳送至客戶端,println()會 在送出數據以後進行換行,而print()則否,注意換行指的是在HTML原始碼中設定換行字符,而不是輸出<br>標籤使得在網頁中能夠 換行。 out(JspWriter)具備緩衝區功能,HTTP的特性是爲了要取得一份資源,就進行一份協議溝通,若是資源數目不少(例如一份HTML文件 還包括了許多的小圖片),而每份資源的容量實際上很小,那麼爲了要取得完整的資源,將會花費不少通信在協議往來上,假設若是 out(JspWriter)不具備緩衝功能,則每一次out.println(),就會直接將數據送出至客戶端,那麼單要完成一個完整網頁的傳送,就 會花費很多的網絡資源,每個JSP網頁預設上都會具備緩衝,您可使用page指令元素的autoFlush屬性來設定是否使用緩衝區功能 。 在Tomcat5上,預設爲每個JSP網頁備有8192字節的緩衝區(您可使用page指令元素的buffer屬性來自緩衝區的大小),在緩衝區還 沒有滿以前,數據不會真正被送出至客戶端,在這以前,您還有機會重設送出的數據,若是緩衝區滿了,數據將會被清出並送至客戶 端,可使用下面這個程序來示範: buffer.jsp <%@page contentType="text/html;charset=Big5"%> <% out.println("預設緩衝區大小:" + out.getBufferSize() + "<br>"); out.flush(); //下面的文字不會出如今客戶端 out.println("您看的到這段文字嗎?"); out.clearBuffer(); out.println("這段您能夠看到!"); %> 您可使用flush()直接清出緩衝區的內容,而clearBuffer()會將緩衝區的內容清除,因此第二段文字不會出如今客戶端的網頁上, 而最後一段會整個JSP網頁執行完整後自動送出至客戶端,執行結果以下: 預設緩衝區大小:8192 這段您能夠看到! 您可使用page指令元素的autoFlush來設定JSP頁面是否使用緩衝區自動清出功能,out(JspWriter)以一種方式與 HttpServletResponse的PrintWriter創建關係,二者之間的行爲關係取決因而否使用緩衝區自動清出,若是使用緩衝區自動清出,則 在緩衝區滿以前,或是使用flush()以前不會創建PrintWriter對象來對客戶端進行輸出,若是不使用緩衝區自動清出,則寫入out (JspWriter)對象的數據會直接寫入PrintWriter對象,而後在指定flush()以後輸出至客戶端。 若是您將autoFlush設定爲false,則您必須明確的使用flush()來輸出數據,不然緩衝區滿了的話,就會發生IOException例外,使用 緩衝區有其好處,但因爲緩衝區在滿以前,數據並不會真正送出客戶端,因此會有響應延遲的問題,若是您要實時性將結果響應至客 戶端,則能夠關閉緩衝區。 下面這個程序測試緩衝區關閉以後,若是緩衝區滿了,會有什麼結果: buffer.jsp <%@page contentType="text/html;charset=Big5" %> <% for(int i=0; i<2000; i++){ out.println("test"); //out.flush(); } %> 若是沒有移開out.flush()的批註符號,則會響應一下的錯誤訊息: HTTP Status 500 - type Exception report message description The server encountered an internal error() that prevented it from fulfilling this request. exception java.io.IOException: Error: JSP Buffer overflow ......
相關文章
相關標籤/搜索