請求轉發和重定向
request.setAttribute("test","hello"); request.getRequestDispatcher("/test.jsp").forword(request,response); response.sendRedirect("test.jsp");
顯示結果:

第一種 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