轉發(forward):瀏覽器地址不會改變,始終是同一個請求。執行forward時,瀏覽器不知道服務器發送的內容是從何處來,瀏覽器地址欄中還是原來的地址。forward是內部重定向。
重定向(sendRedirect): 瀏覽器地址會改變,用兩個請求。執行redirect時,服務器端告訴瀏覽器重新去請求地址。redirect是外部重定向。
1.轉發
(1)地址欄不會改變。
(2)轉發只能轉發到當前web應用內的資源。
(3)在轉發過程中,可以把數據保存到request域對象中。
轉發過程:
客戶首先發送一個請求到服務器端,服務器端發現匹配的servlet,並指定它去執行,當這個servlet執行完之後,它要調用getRequestDispacther()方法,把請求轉發給指定的jsp,整個流程都是在服務器端完成的,而且是在同一個請求裏面完成的,因此servlet和jsp共享的是同一個request,在servlet裏面放的所有東西,在jsp中都能取出來,因此,jsp能把結果getAttribute()出來,getAttribute()出來後執行完把結果返回給客戶端。整個過程是一個請求,一個響應。
用<jsp:forward page=""/>,它是直接在server做的,瀏覽器並不知道,也不和瀏覽器打交道,這從瀏覽器的地址並不變化可以看出。
2.重定向
(1) 地址欄會改變,變成重定向到地址。
(2) 重定向可以跳轉到當前web應用,或其他web應用,甚至是外部域名網站。
(3)不能在重定向的過程,把數據保存到request中
用response.sendRedirect做轉向的原理,它其實是向瀏覽器發送一個特殊的Header,然後由瀏覽器來做轉向,轉到指定的頁面,所以用sendRedirect時,瀏覽器的地址欄上可以看到地址的變化。
重定向過程:
客戶發送一個請求到服務器,服務器匹配servlet,這都和請求轉發一樣,servlet處理完之後調用了sendRedirect()這個方法,這個方法是response的方法。所以,當這個servlet處理完之後,看到response.senRedirect()方法,立即向客戶端返回這個響應,響應行告訴客戶端你必須要再發送一個請求,去訪問jsp,緊接着客戶端收到這個請求後,立刻發出一個新的請求,去請求jsp,這裏兩個請求互不干擾,相互獨立,在前面request裏面setAttribute()的任何東西,在後面的request裏面都獲得不了。可見,在sendRedirect()裏面是兩個請求,兩個響應。
所以使用response.sendRedirect時就需要注意以下兩點:
1,在使用response.sendRedirect時,前面不能有HTML輸出。
這並不是絕對的,不能有HTML輸出其實是指不能有HTML被送到了瀏覽器。事實上現在的server都有cache機制,一般在8K(我是說JSP SERVER),這就意味着,除非你關閉了cache,或者你使用了out.flush()強制刷新,那麼在使用sendRedirect之前,有少量的HTML輸出也是允許的。
如果報錯說,“一些信息已經被submitted”(原文忘了),那麼,你就要注意看了,前面是不是有過多的HTML輸出了。
2,在response.sendRedirect之後,應該緊跟一句return;
我們已經知道response.sendRedirect是通過瀏覽器來做轉向的,所以只有在頁面處理完成後,纔會有實際的動作。既然你已經要做轉向了,那麼後的輸出還有什麼意義呢?而且有可能會因爲後面的輸出導致轉向失敗。
細節:
重定向是客戶端跳轉 代表的是服務器根目錄 tomcat/webapps/ 代表這裏面的內容
Servlet轉發是內部轉發 代表 tomcat/webapps/項目