request.getRequestDispatcher(url)使用後天一直報錯,進入死迴圈
request.getRequestDispatcher(url)使用後天一直報錯,進入死迴圈
後來百度了下:
request.getRequestDispatcher(“/資源URI”).forward(request,response)
response.sendRedirect(“/web應用/資源URI”);
1:
String url = "index.jsp";
2:
String url = "/index.jsp";
3:
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
url = basePath + "index.jsp";
request.getRequestDispatcher(url).forward(request, response);
只有第二種情況才是正確的。
這個問題,我花了不少的時間才知道,尷尬。
順便再瞄一下:重定向和轉發的區別:
原文:https://blog.csdn.net/uk8692/article/details/12865571
在進行web開發時,跳轉是最常見的,今天在這裡來學習下2種跳轉:
第一種是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"