Servlet轉發forward和重定向response.sendRedirect()區別

轉發(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/項目

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