getRequestDispatcher()與sendRedirect()區別

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中存放的變量不會失效,就像把兩個頁面拼到了一起。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章