、requestDispatcher和sendRedirect()的區別


1.會話信息保存在服務器內存上,可以斷續訪問,和cookie相比,其保存在服務器上。
2.男人就像藍牙:只有在你接近時,他才會找上你。當你離開后,他便又去找其他的“設備”了。女人就像Wi-Fi:她能看到周圍所有的“設備”,但只選擇強壯的那個“接入”。
3.會話關閉:瀏覽器關閉,主動關閉,會話超時
4.會話底層實現:cookie和url重寫(保存的是sessionID,就是調用response.encodeURL,那么自動加上id)
5.session里有創建時間和最后訪問時間,不同於cookie(還得自己寫),不過返回的是毫秒數,那么new Date(方法)
6.javabean的類必須是public的,否則不能訪問的!!!一定要用public申明
7.BeanUtils主要提供了對於JavaBean進行各種操作。
8.forward是服務器轉發,在servlet內部,而sendRedirect是重定向(通過瀏覽器)。

  1. forward轉發是在容器內部實現的同一個Web應用程序的之間的轉發,所以forward方法只能重定向到同一個Web應用程序中的一個資源,重定向后瀏覽器地址欄URL不變,而sendRedirect方法可以重定向到任何URL, 因為這種方法是修改http頭來實現的,URL沒什么限制,重定向后瀏覽器地址欄URL改變。
  2. forward重定向將原始的HTTP請求對象(request)從一個servlet實例傳遞到另一個實例,而采用sendRedirect方式兩者不是同一個application。
  3. 基於第二點,參數的傳遞方式不一樣。forward的form參數跟着傳遞,所以在第二個實例中可以取得HTTP請求的參數。sendRedirect只能通過鏈接傳遞參數,response.sendRedirect(“login.jsp?param1=a”)。 
  4. 使用forward重定向的過程,是瀏覽器先向目的Servlet發送一次Request請求,然后再服務器端由Servlet再將請求發送到目的url,再由服務器端Servlet返回Response到瀏覽器端。瀏覽器和服務器一次請求響應(3次操作)。使用sendRedirect轉發的過程,瀏覽器先向目的Servlet發送一次請求,Servlet看到sendRedirect將目的url返回到瀏覽器,瀏覽器再去請求目的url,目的url再返回response到瀏覽器。瀏覽器和服務器兩次請求響應(四次操作)。可以看出哪種方式稍快一些。
  • forward方法的調用者與被調用者之間共享Request和Response,sendRedirect方法由於兩次瀏覽器服務器請求,所以有兩個Request和Response。如果使用request.setAttribute傳遞一些屬性就需要用forward,如果想要跳轉到別的應用的資源,就需要用sendRedirect。
  • 無論是forward方法還是sendRedirect方法調用前面都不能有PrintWriter輸出到客戶端。
       forward方法報錯: java.lang.IllegalStateException: Cannot forward after response has been committed
       sendRedirect報錯:java.lang.IllegalStateException
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)
  •         再來看一個具體例子!!!參考:http://zhaoyuqiang.blog.51cto.com/6328846/1132795

    <html> 
    
    <head> 
    
    <title>web</title> 
    
    </head> 
    
    <body> 
    
    <h1>我的技術博客:http://zhaoyuqinag.blog.51cto.com</h1> 
    
    </body> 
    
    </html> 
    <%@ page  language="java" contentType="text/html" pageEncoding="gbk" %> 
    
    <html> 
    
    <head> 
    
    <title>web</title> 
    
    </head> 
    
    <body> 
    
    <%   
    
        System.out.println("====forward跳轉之前=========");  
    
    %> 
    
    <jsp:forward page="turnAfter.html"/> 
    
    <%   
    
        System.out.println("====forward跳轉之后=========");  
    
    %> 
    
    </body> 
    
    </html> 

            運行一下,看瀏覽器的結果,的確是跳轉了,但是地址欄並沒有發生改變,更有趣的是看一下服務器的結果,如下圖所示:

    image

            根據結果顯示,只有跳轉之前,而沒有跳轉之后。我們再來看另一種跳轉方式會怎么樣。

    <%@ page  language="java" contentType="text/html" pageEncoding="gbk" %> 
    
    <html> 
    
    <head> 
    
    <title>web</title> 
    
    </head> 
    
    <body> 
    
    <%   
    
        System.out.println("====response跳轉之前=========");  
    
    %> 
    
       <% response.sendRedirect("turnAfter.html");%> 
    
    <%   
    
        System.out.println("====response跳轉之后 =========");  
    
    %> 
    
    </body> 
    
    </html> 

            運行一下,看一下服務器的結果如下:

                image

            可以看出forward屬於無條件的跳轉。跳轉之前的語句會執行,而跳轉之后的語句將不會執行,那么如果現在在jsp中使用了JDBC的話,很明顯必須子啊跳轉之前進行數據庫的關閉,否則數據庫就再也無法關閉了;sendredirect跳轉是在所有語句都執行完之后才完成的操作。


    免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM