HttpServletResponse.sendRedirect與RequestDispatcher.forward方法都可以實現獲取相應URL資源。
sendRedirect實現請求重定向,forward實現的是請求轉發。在web服務器內部的處理機制也是不一樣的。
1.forward方法只能轉發給同一個web站點的資源,而sendRedirect方法還可以定位到同一個web站點的其他應用,甚至可以通過傳入絕對路徑定位到別的web站點,這事forward的方法所不能比擬的優勢。
如果傳給RequestDispatcher 的參數以"/"開頭,則訪問的是當前web應用的根目錄。如果傳給sendRedirect方法以"/"開頭,訪問的是整個web站點的根目錄。
2.forward重定向后,瀏覽器url地址不變,sendRedirect轉發后,瀏覽器url地址變為目的url地址。
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)