jimingminlovefly

          統(tǒng)計

          最新評論

          Servlet中forward和redirect的區(qū)別(轉)

          forward方式:request.getRequestDispatcher("/somePage.jsp").forwardrequest, response);     
          redirect方式:response.sendRedirect("/somePage.jsp");
          forward是服務器內部重定向,程序收到請求后重新定向到另一個程序,客戶機并不知道;redirect則是服務器收到請求后發(fā)送一個狀態(tài)頭給客戶,客戶將再請求一次,這里多了兩次網絡通信的來往。當然forward也有缺點,就是forward的頁面的路徑如果是相對路徑就會有些問題了。    forward 會將 request state , bean 等等信息帶往下一個 jsp
          redirect 是送到 client 端后再一次 request , 所以資料不被保留.
          使用 forward 你就可以用 getAttribute() 來取的前一個 jsp 所放入的 bean 等等資料

          在網上看到一些帖子,總結了一些區(qū)別,可以從以下幾個方面來看:

          1.從地址欄顯示來說

          forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發(fā)給瀏覽器.瀏覽器根本不知道服務器發(fā)送的內容從哪里來的,所以它的地址欄還是原來的地址.

          redirect是服務端根據邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址.所以地址欄顯示的是新的URL.所以redirect等于客戶端向服務器端發(fā)出兩次request,同時也接受兩次response。

          2.從數據共享來說

          forward:轉發(fā)頁面和轉發(fā)到的頁面可以共享request里面的數據.
          redirect:不能共享數據.

          redirect不僅可以重定向到當前應用程序的其他資源,還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源.

          forward,方法只能在同一個Web應用程序內的資源之間轉發(fā)請求.forward 是服務器內部的一種操作.
          redirect 是服務器通知客戶端,讓客戶端重新發(fā)起請求.

          所以,你可以說 redirect 是一種間接的請求, 但是你不能說"一個請求是屬于forward還是redirect "


          3.從運用地方來說

          forward:一般用于用戶登陸的時候,根據角色轉發(fā)到相應的模塊.

          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>標簽以下的代碼,將不能執(zhí)行.


          你能夠向目標文件傳送參數和值,在這個例子中我們傳遞的參數名為username,值為scott,如果你使用了<jsp:param>標簽的話,目標文件必須是一個動態(tài)的文件,能夠處理參數.


          如果你使用了非緩沖輸出的話,那么使用<jsp:forward>時就要小心。
          如果在你使用<jsp:forward>之前,jsp文件已經有了數據,那么文件執(zhí)行就會出錯.

          屬性

          page="{relativeurl | <%= expression %>}"
          這里是一個表達式或是一個字符串用于說明你將要定向的文件或url.這個文件可以是jsp,程序段,或者其它能夠處理request對象的文件(如asp,cgi,php).

          <jsp:param name="parametername" value="{parametervalue | <%= expression %>}" />+
          向一個動態(tài)文件發(fā)送一個或多個參數,這個文件一定是動態(tài)文件.

          如果你想傳遞多個參數,你可以在一個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開發(fā)中,經常會用到跳轉頁面的方法,一般有下面兩種方法。
          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方法。如果當前頁面的緩沖區(qū)(buffer)不是空的,那么你在調用forward方法前必須先清空緩沖區(qū)。
          “/ “代表相對與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> 之前有很多輸出,前面的輸出已使緩沖區(qū)滿,將自動輸出到客戶端,那么該語句將不起作用,這一點應該特別注意。
          另外要注意:它不能改變?yōu)g覽器地址,刷新的話會導致重復提交
          從http://localhost:8080/Test/gw/page.jsp中轉發(fā)
          <jsp:forward   page= “OtherPage.jsp “/> 在JSP頁面被解析后轉換成pageContext.forward( “OtherPage.jsp [...]

           

          --------------------------------------------------------------------------------------------------

          清空當前緩存:

          在之前撰寫JSP的例子中,實用了out這個對象,這個對象您不用事先宣告,就可以在JSP網頁中使用,這是JSP所提供的隱含對象

          (Implicit Object),在轉譯為Servlet之后,out會轉換為對應于javax.servlet.jsp.JspWriter型態(tài)的對象。

          JspWriter直接繼承自java.io.Writer,您可以使用println()、print()方法將指定的數據以字符的方式傳送至客戶端,println()會

          在送出數據之后進行換行,而print()則否,注意換行指的是在HTML原始碼中設定換行字符,而不是輸出<br>標簽使得在網頁中可以

          換行。

          out(JspWriter)具有緩沖區(qū)功能,HTTP的特性是為了要取得一份資源,就進行一份協(xié)議溝通,如果資源數目很多(例如一份HTML文件

          還包括了許多的小圖片),而每份資源的容量實際上很小,那么為了要取得完整的資源,將會花費很多通訊在協(xié)議往來上,假設如果

          out(JspWriter)不具有緩沖功能,則每一次out.println(),就會直接將數據送出至客戶端,那么單要完成一個完整網頁的傳送,就

          會花費不少的網絡資源,每一個JSP網頁預設上都會具有緩沖,您可以使用page指令元素的autoFlush屬性來設定是否使用緩沖區(qū)功能

          在Tomcat5上,預設為每一個JSP網頁備有8192字節(jié)的緩沖區(qū)(您可以使用page指令元素的buffer屬性來自緩沖區(qū)的大小),在緩沖區(qū)還

          沒有滿之前,數據不會真正被送出至客戶端,在這之前,您還有機會重設送出的數據,如果緩沖區(qū)滿了,數據將會被清出并送至客戶

          端,可以使用下面這個程序來示范:

          buffer.jsp
          <%@page contentType="text/html;charset=Big5"%>
          <%
          out.println("預設緩沖區(qū)大小:" + out.getBufferSize() + "<br>");
          out.flush();
          //下面的文字不會出現在客戶端
          out.println("您看的到這段文字嗎?");
          out.clearBuffer();
          out.println("這段您可以看到!");
          %>

          您可以使用flush()直接清出緩沖區(qū)的內容,而clearBuffer()會將緩沖區(qū)的內容清除,所以第二段文字不會出現在客戶端的網頁上,

          而最后一段會整個JSP網頁執(zhí)行完整后自動送出至客戶端,執(zhí)行結果如下:

          預設緩沖區(qū)大小:8192

          這段您可以看到!

          您可以使用page指令元素的autoFlush來設定JSP頁面是否使用緩沖區(qū)自動清出功能,out(JspWriter)以一種方式與

          HttpServletResponse的PrintWriter建立關系,兩者之間的行為關系取決于是否使用緩沖區(qū)自動清出,如果使用緩沖區(qū)自動清出,則

          在緩沖區(qū)滿之前,或是使用flush()之前不會建立PrintWriter對象來對客戶端進行輸出,如果不使用緩沖區(qū)自動清出,則寫入out

          (JspWriter)對象的數據會直接寫入PrintWriter對象,然后在指定flush()之后輸出至客戶端。

          如果您將autoFlush設定為false,則您必須明確的使用flush()來輸出數據,否則緩沖區(qū)滿了的話,就會發(fā)生IOException例外,使用

          緩沖區(qū)有其好處,但由于緩沖區(qū)在滿之前,數據并不會真正送出客戶端,所以會有響應延遲的問題,如果您要實時性將結果響應至客

          戶端,則可以關閉緩沖區(qū)。

          下面這個程序測試緩沖區(qū)關閉之后,如果緩沖區(qū)滿了,會有什么結果:

          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
          ......

           

          轉自http://blog.sina.com.cn/s/blog_4f925fc30100mt2e.html

          posted on 2015-01-30 17:42 計明敏 閱讀(160) 評論(0)  編輯  收藏 所屬分類: jsp/servlet

          主站蜘蛛池模板: 朝阳区| 灵璧县| 宣恩县| 增城市| 拉萨市| 九江市| 安丘市| 和静县| 常德市| 石屏县| 天峨县| 龙川县| 阳信县| 博爱县| 达拉特旗| 鹿泉市| 工布江达县| 汉阴县| 新田县| 赤城县| 绥宁县| 承德市| 枝江市| 侯马市| 淄博市| 尉犁县| 泸定县| 司法| 沁阳市| 屏山县| 乌兰察布市| 同德县| 建平县| 永修县| 沅江市| 洛宁县| 灵宝市| 灌南县| 沽源县| 隆德县| 普定县|