(轉)Jsp 重定向、請求轉發


請求轉發:request.getRequestDispatcher(URL地址).forward(request, response)

原理:

  1. 客戶端發送請求,Servlet1做出處理。
  2. Servlet1調用sendReadirect()方法,將請求轉發給Servlet2來處理請求,為客戶端服務。 
  3. Servlet2對客戶端瀏覽器做出響應。

請求轉發允許把請求轉發給同一應用程序中的其他Web組件。這種技術通常用於Web應用控制層的Servlet流程控制器,它檢查HTTP請求數據,並將請求轉發到合適的目標組件,目標組件執行具體的請求處理具體的請求處理操作,並生成響應結果。

Servlet類使用javax.servlet.RequestDispatcher.forward()方法來轉發它所收到的HTTP請求。轉發目標組件將處理該請求並生成響應結果,或者將請求繼續轉發到另一個組件。最初請求的ServletRequest和ServletResponse對象被傳遞給轉發目標組件,這使得目標組件可以訪問整個請求上下文。值得注意的是,只能把請求轉發給同一Web應用中的組件,而不能轉發給其他Web應用的組件。

在JSP頁面中,可以使用<jsp:forward>標簽來轉發請求。例如: <jsp:forward page="hello.jsp">

對於請求轉發,轉發的源組件和目標組件共享request范圍內的共享數據。

 

 

重定向:response.sendRedirect(URL地址)

原理:

  1. 客戶端發送請求,Servlet1做出處理。  
  2. Servlet1調用sendReadirect()方法,將客戶端的請求重新定位到Servlet2。  
  3. 客戶端瀏覽器訪問Servlet2。
  4. Servlet2對客戶端瀏覽器做出響應。

 

Web組件可以將請求重定向到任一URL,而不僅僅是同一應用中的URL。

重定向的源組件和目標組件之間不共用同一個HttpServletRequest對象,因此不能共享request范圍內的共享數據。

HttpServletResponse的sendRedirect()方法向瀏覽器返回包含重定向的信息,瀏覽器根據這一信息迅速發出一個新HTTP請求,請求訪問重定向目標組件。

 

 

包含

包含關系允許一個Web組件聚集來自同一個應用中其他Web組件的輸出數據,並使用被聚集的數據來創建響應結果。這種技術通常用於模板處理器,它可以控制網頁的布局。模板中每個頁面區域的內容來自不同的URL,從而組成單個頁面。這種技術能夠為應用程序提供一致的外觀和感覺。包含關系的源組件和目標組件共用同一個HttpServletRequest對象,因此它們共享request范圍內的共享數據。

 

 

轉發、重定向的區別:

  1. Request Dispatcher.forward()是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向后的地址;服務器內部轉發,請求轉發,整個過程處於同一個請求當中。
  2. response.sendRedirect()則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉后的鏈接地址。不在同一個請求。重定向,實際上客戶端會向服務器端發送兩個請求。
  3. forward()更加高效,在可以滿足需要時,盡量使用RequestDispatcher.forward()方法。
  4. RequestDispatcher是通過調用HttpServletRequest對象的getRequestDispatcher()方法得到的,是屬於請求對象的方法。
  5. sendRedirect()是HttpServletResponse對象的方法,即響應對象的方法,既然調用了響應對象的方法,那就表明整個請求過程已經結束了,服務器開始向客戶端返回執行的結果。

(1)RequestDispatcher.forward方法只能將請求轉發給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect 方法不僅可以重定向到當前應用程序中的其他資源,還可以重定向到同一個站點上的其他應用程序中的資源,甚至是使用絕對URL重定向到其他站點的資源。如果傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對於整個WEB站點的根目錄;如果創建RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對於當前WEB應用程序的根目錄。

(2)調用HttpServletResponse.sendRedirect方法重定向的訪問過程結束后,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重定向的目標URL;而調用RequestDispatcher.forward 方法的請求轉發過程結束后,瀏覽器地址欄保持初始的URL地址不變。

(3)HttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的 訪問請求,這個過程好比有個綽號叫“瀏覽器”的人寫信找張三借錢,張三回信說沒有錢,讓“瀏覽器”去找李四借,並將李四現在的通信地址告訴給了“瀏覽器”。於是,“瀏覽器”又按張三提供通信地址給李四寫信借錢,李四收到信后就把錢匯給了“瀏覽器”。可見,“瀏覽器”一共發出了兩封信和收到了兩次回復, “瀏覽器”也知道他借到的錢出自李四之手。RequestDispatcher.forward方 法在服務器端內部將請求轉發給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在服務器程序內部發生了轉發行為。這個過程好比綽號叫“瀏覽器”的人寫信找張三借錢,張三沒有錢,於是張三找李四借了一些錢,甚至還可以加上自己的一些錢,然后再將這些錢匯給了“瀏覽器”。可見,“瀏覽器”只發 出了一封信和收到了一次回復,他只知道從張三那里借到了錢,並不知道有一部分錢出自李四之手。

(4)RequestDispatcher.forward方法的調用者與被調用者之間共享相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect()方法調用者與被調用者使用各自的request對象和response對象,它們屬於兩個獨立的訪問請求和響應過程。對於同一個WEB應用程序的內部資源之間的跳轉,特別是跳轉之前要對請求進行一些前期預處理,並要使用HttpServletRequest.setAttribute方法傳遞預處理結果,那就應該使用RequestDispatcher.forward方法。不同WEB應用程序之間的重定向,特別是要重定向到另外一個WEB站點上的資源的情況,都應該使用HttpServletResponse.sendRedirect方法。

(5)無論是RequestDispatcher.forward方法,還是HttpServletResponse.sendRedirect方法,在調用它們之前,都不能有內容已經被實際輸出到了客戶端。如果緩沖區中已經有了一些內容,這些內容將被從緩沖區中清除。

 

其它資料:http://www.2cto.com/kf/201109/105650.html


免責聲明!

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



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