sendredirect()和forward()的區別 (轉)


sendRedirect() 和forward()的區別

 

HttpServletResponse.sendRedirect與RequestDispatcher.forward方法都可以實現獲取相應URL資源。
 
sendRedirect實現請求重定向,forward實現的是請求轉發。
 
在web服務器內部的處理機制也是不一樣的。
 
 
 
1. 跳轉方式 
 運用forward方法只能重定向到同一個Web應用程序中的一個資源。而sendRedirect方法可以讓你重定向到任何URL。  
 表單form的action= "/uu ";sendRedirect( "/uu ");表示相對於服務器根路徑。
 如http://localhost:8080/Test應用(則提交至http://localhost:8080/uu);  
 Forward代碼中的 "/uu "則代表相對與WEB應用的路徑。如http://localhost:8080/Test應用(則提交至http://localhost:8080/Test/uu);
 
 
 
2.forward重定向后,瀏覽器url地址不變,sendRedirect轉發后,瀏覽器url地址變為目的url地址。
forward()無法重定向至有frame的jsp文件,可以重定向至有frame的html文件, 同時forward()無法在后面帶參數傳遞,
比如servlet?name=frank,這樣不行,可以程序內通過response.setAttribute( "name ",name)來傳至下一個頁面. 
 
 
 
3. 使用forward重定向的過程,是瀏覽器先向目的Servlet發送一次Request請求,然后在服務器端由Servlet再將請求發送到目的url,再由服務器端Servlet返回Response到瀏覽器端。瀏覽器和服務器一次請求響應。
 
使用sendRedirect轉發的過程,瀏覽器先向目的Servlet發送一次請求,Servlet看到sendRedirect將目的url返回到瀏覽器,瀏覽器再去請求目的url,目的url再返回response到瀏覽器。瀏覽器和服務器兩次請求響應。
 
 
 
4. forward方法的調用者與被調用者之間共享Request和Response
 
sendRedirect方法由於兩次瀏覽器服務器請求,所以有兩個Request和Response。
 
如果使用request.setAttribute傳遞一些屬性就需要用forward,如果想要跳轉到別的應用的資源,就需要用sendRedirect。
 
 
 
5.無論是forward方法還是sendRedirect方法調用前面都不能有PrintWriter輸出到客戶端。
 
forward方法報錯: Java.lang.IllegalStateException: Cannot forward after response has been committed
 
sendRedirect報錯:java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435)


免責聲明!

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



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