乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      jsp/servlet中 forward, include, reDirect 之間的區(qū)別

       燮羽 2010-12-30
      討論它們的區(qū)別之前,先讓我們看下它們是怎樣被調用的?
       
      Response.sendRedirect(redirect)
      redirect="AccessGoalCharts.jsp?rcatID=3&rhaID=All_&doSearch=true”
      實際上,container會將這個 redirect的 url字符串重新送到
      Browser interface,相當于用戶重新在address欄中輸入了一個地址,赫赫,
      這樣解釋簡單吧?
       
      request.getRequestDispatcher("welcome.jsp").forward(request, response);
      我們查一下web.xml,如果我們沒有找到相應的servlet  mapping,那么這套
      Request和response(也就是原來的browse interface)就被轉到 welcome.jsp
      去處理了,welcome.jsp產生的html page也就被返回到了 response(也就是原來的browser interface).如果在web.xml當中我們找到了相應的 servlet mapping, 如下所示,
       <servlet-mapping>
          <servlet-name>DemoServlet</servlet-name>
          <url-pattern>/welcome.jsp</url-pattern>
       </servlet-mapping>
      那么這套request和response就被forward到了DemoServlet的 doGet或者 doPost去處理了,問題是,getRequestDispatcher為什么不改名字叫做 getURLDispatcher,這不是更加符合 由 web.xml控制的實際情況嗎?
       
      Request.getRequestDispatcher(“welcome.jsp”).include(request,response)和 forward(request,response)的情況一模一樣,區(qū)別在于,這個response,也就是 Browse Interface在接收了welcome.jsp產生的html page以后(假設在 web,xml當中沒有相對應于 welcome.jsp的 servlet-mapping),還可以在這個response( browser interface)當中接收其他的html page,我測試過的代碼如下所示:
                  request.getRequestDispatcher("welcome.jsp").include(request, response);
                 
                  PrintWriter out = response.getWriter();
                  out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
                  out.println("<HTML>");
                  out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
                  out.println(" <BODY>");
                  out.print("    This is " + request.getParameter("name"));
                  out.print(this.getClass());
                  out.println(", using the POST method");
                  out.println(" </BODY>");
                  out.println("</HTML>");
                  out.flush();
                  out.close();
       
      好了,還有一些考試大全中經常描述的 forward對于 用戶來講是透明的,而 reDirect對于用戶來講是 在browser的地址欄中可見的講法,都是正確的講法.
       
       
      好,我再用通俗的講法講解一下 sendRedirct, forward, include的區(qū)別 (基于 servlet api 2.2以上)
       (1)response.sendRedirect(String location) 
        Sends a temporary redirect response to the client using the specified redirect location URL
        實際上是給client返回一個臨時的response,里面也就一個url,告訴client,我現(xiàn)在已經處理完了你的request,
        你應該進入這個URL,它會處理你的request了(這個request的內容您這個client可能就不太清楚了)
        (2)requestDispatcher.forward(request, response)
        現(xiàn)在的servlet把控制權完全交給另外一個Servlet,這個servlet已經預先處理過的request和response也一并移交過去,
        這個forward的過程實際上Client并不知道,是Server端的幾個servlet collaboration.
        (3)include又和 forward有什么區(qū)別呢?
        赫赫, requestDispatcher.include(request, response)
        好像沒有什么區(qū)別啊,include僅僅是include, 接收request的那個servlet (called servlet),它往printerWriter(或OutputStream,   writer是寫文本
        而stream是寫二進制)中寫的內容是 caller servlet往 printerWriter(或 outputStream)中寫的內容的一部分.而  
        requestDispatcher.forward(request, response)就不一樣了,calling servlet控制權完全交出去了, calling servlet
        的response buffer中的東西都被清空了,所以如果你要 forward,就是轉移控制權的話, 你根本就不應該在calling servlet
        中的response里面寫任何東西,寫了的話一旦 forward的話也就白瞎了,因為被清空了嘛.
        (4)為什么 request.getRequestDispatcher 而 response.sendRedirect(new_url)呢?
        我舉個簡單的例子,    request.getRequestDispatcher("/servlets/bookItems?bookId=18871");
        赫赫,在 getRequestDispatcher的同時還可以往 request當中塞一個parameter啊.
        而response.sendRirect(new_url)呢, 這個new_url可是會返回給client browser看的,所以
        當然是response.sendRedirect(new_url)了.
       
       
      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.從數(shù)據共享來說

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

      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í)行.


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


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

      屬性

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

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

      如果你想傳遞多個參數(shù),你可以在一個jsp文件中使用多個<jsp:param>。name指定參數(shù)名,value指定參數(shù)值.

      <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()無法在后面帶參數(shù)傳遞,比如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()方法將指定的數(shù)據以字符的方式傳送至客戶端,println()會

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

      換行。

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

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

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

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

      。

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

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

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

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

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

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

      預設緩沖區(qū)大?。?192

      這段您可以看到!

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

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

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

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

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

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

      戶端,則可以關閉緩沖區(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
      ......

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多