getRequestDispatcher()與sendRedirect()區別
1. request.getRequestDispatcher()是請求轉發,前後頁面共享一個request ; response.sendRedirect()是重新定向,前後頁面不是一個request。
2.RequestDispatcher.forward()是在服務器端運行;
HttpServletResponse.sendRedirect()是通過向客戶瀏覽器發送命令來完成. 所以RequestDispatcher.forward()對於瀏覽器來說是“透明的”; HttpServletResponse.sendRedirect()則不是。
3.ServletContext.getRequestDispatcher(String url)中的url只能使用絕對路徑; 而ServletRequest.getRequestDispatcher(String url)中的url可以使用相對路徑。因爲ServletRequest具有相對路徑的概念;而ServletContext對象無次概念。 RequestDispatcher對象從客戶端獲取請求request,並把它們傳遞給服務器上的servlet,html或jsp。
它有兩個方法: 1.void forward(ServletRequest request,ServletResponse response) 用來傳遞request的,可以一個Servlet接收request請求,另一個Servlet用這個request請 求來產生response。request傳遞的請求,response是客戶端返回的信息。forward要在response到達客戶端之前調用,也 就是 before response body output has been flushed。如果不是的話,它會報出異常。
2.void include(ServletRequest request,ServletResponse response) 用來記錄保留request和response,以後不能再修改response裏表示狀態的信息。 如果需要把請求轉移到另外一個Web App中的某個地址,
可以按下面的做法: 1. 獲得另外一個Web App的ServletConext對象(currentServletContext.getContext(uripath)).
2. 調用ServletContext.getRequestDispatcher(String url)方法。 eg:ServletContext.getRequestDispatcher("smserror.jsp").forward(request,response);
res.sendRedirect()=重定向 forward(req,res)=轉發
重定向和轉發有一個重要的不同:當使用轉發時,JSP容器將使用一個內部的方法來調用目標頁面,新的頁面繼續處理同一個請求,而瀏覽器將不會知道這個過程。 與之相反,重定向方式的含義是第一個頁面通知瀏覽器發送一個新的頁面請求。因爲,當你使用重定向時,瀏覽器中所顯示的URL會變成新頁面的URL, 而當使用轉發時,該URL會保持不變。重定向的速度比轉發慢,因爲瀏覽器還得發出一個新的請求。同時,由於重定向方式產生了一個新的請求,所以經過一次重定向後,request內的對象將無法使用。 怎麼選擇是重定向還是轉發呢?通常情況下轉發更快,而且能保持request內的對象,所以他是第一選擇。但是由於在轉發之後,瀏覽器中URL仍然指向開始頁面,此時如果重載當前頁面,開始頁面將會被重新調用。如果你不想看到這樣的情況,則選擇轉發。 轉發和重定向的區別 不要僅僅爲了把變量傳到下一個頁面而使用session作用域,那會無故增大變量的作用域,轉發也許可以幫助你解決這個問題。
重定向:以前的request中存放的變量全部失效,並進入一個新的request作用域。
轉發:以前的request中存放的變量不會失效,就像把兩個頁面拼到了一起。