servlet中請求轉發(forword)與重定向(sendredirect)


請求轉發和重定向

request.setAttribute("test","hello");
request.getRequestDispatcher("/test.jsp").forword(request,response); 
response.sendRedirect("test.jsp");

顯示結果:

1、當用request.getRequestDispatcher("/test.jsp").forword(request,response); 請求轉發后,結果頁面輸出:hello 
2、當用response.sendRedirect("test.jsp");重定向后,結果頁面輸出:null
 

第一種 request.getRequestDispatcher().forward(request,response):

1、屬於轉發,也是服務器跳轉,相當於方法調用,在執行當前文件的過程中轉向執行目標文件,兩個文件(當前文件和目標文件)屬於同一次請求,前后頁共用一個request,可以通過此來傳遞一些數據或者session信息,request.setAttribute()和request.getAttribute()。

2、在前后兩次執行后,地址欄不變,仍是當前文件的地址。

3、不能轉向到本web應用之外的頁面和網站,所以轉向的速度要快。

4、URL中所包含的“/”表示應用程序(項目)的路徑。

第二種 response.sendRedirect():

1、屬於重定向,也是客戶端跳轉,相當於客戶端向服務端發送請求之后,服務器返回一個響應,客戶端接收到響應之后又向服務端發送一次請求,一共是2次請求,前后頁不共用一個request,不能讀取轉向前通過request.setAttribute()設置的屬性值。

2、在前后兩次執行后,地址欄發生改變,是目標文件的地址。

3、可以轉向到本web應用之外的頁面和網站,所以轉向的速度相對要慢。

4、URL種所包含的"/"表示根目錄的路徑。

特殊的應用:對數據進行修改、刪除、添加操作的時候,應該用response.sendRedirect()。如果是采用了request.getRequestDispatcher().forward(request,response),那么操作前后的地址欄都不會發生改變,仍然是修改的控制器,如果此時再對當前頁面刷新的話,就會重新發送一次請求對數據進行修改,這也就是有的人在刷新一次頁面就增加一條數據的原因。

 

如何采用第二種方式傳遞數據:

1、可以選擇session,但要在第二個文件中刪除;

2、可以在請求的url中帶上參數,如"add.htm?id=122"

典型的應用場景
1. forward: 訪問 Servlet 處理業務邏輯,然后 forward 到 jsp 顯示處理結果,瀏覽器里 URL 不變
2. redirect: 提交表單,處理成功后 redirect 到另一個 jsp,防止表單重復提交,瀏覽器里 URL 變了

轉發和重定向的路徑問題

1)使用相對路徑在重定向和轉發中沒有區別
2)重定向和請求轉發使用絕對路徑時,根/路徑代表了不同含義
重定向response.sendRedirect("xxx")是服務器向客戶端發送一個請求頭信息,由客戶端再請求一次服務器。/指的Tomcat的根目錄,寫絕對路徑應該寫成"/當前Web程序根名稱/資源名" 。如"/WebModule/login.jsp","/bbs/servlet/LoginServlet"
轉發是在服務器內部進行的,寫絕對路徑/開頭指的是當前的Web應用程序。絕對路徑寫法就是"/login.jsp"或"/servlet/LoginServlet"。

總結:以上要注意是區分是從服務器外的請求,還在是內部轉發,從服務器外的請求,從Tomcat根寫起(就是要包括當前Web的根);是服務器內部的轉發,很簡單了,因為在當前服務器內,/寫起指的就是當前Web的根目錄。

需要用  request.getContextPath()  獲取項目名

//request.getRequestDispatcher("/homePage.jsp").forward(request, response);
  response.sendRedirect(request.getContextPath()+"/homePage.jsp");           //request.getContextPath()獲取項目根路徑/Task01

 


免責聲明!

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



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