這是兩個常常被放在一起進行比較的概念,今天對這兩個概念再重新回顧一下,
前者發生在客戶端(瀏覽器),后者發生在服務器端?,因此也有人把前者稱為客戶端重定向,把后者稱為服務器端重定向,雖然對於后者這種稱謂並不算貼切。本文原文鏈接:
http://blog.csdn.net/bluishglc/article/details/7953614 轉載請注明出處!
Redirect(客戶端重定向)
標准意義上的“重定向”指的是
HTTP重定向,它是HTTP協議規定的一種機制。這種機制是這樣工作的:
(沒有涉及request,只有response)
- 當client向server發送一個請求、要求獲取一個資源時,
- 在server接收到這個請求后發現請求的這個資源實際存放在另一個位置,
- 於是server在返回的response中寫入那個請求資源的正確的URL,並設置reponse的狀態碼為301(表示這是一個要求瀏覽器重定向的response),
- 當client接受到這個response后就會根據新的URL重新發起請求。
重定向有一個典型的特症,即,當一個請求被重定向以后,
最終瀏覽器上顯示的URL往往不再是開始時請求的那個URL了。這就是重定向的由來。
(解決了為什么需要重定向這個功能?)
http重定向的一種典型應用是
防止表單重復提交,其原理是:假如當前是一個用戶信息編輯頁面,表單通過Post提交給saveUser.action, 當該請求提交后,可返回一個重定向的response,地址可以是viewUser.action,即定向到用戶詳情頁面(不能修改和提交)。當然這種防止頁面重復提交的方法作用是有限的, 如果用戶返回表單頁面,重新提交表單,或是用戶在服務器端響應到達之前,多次點擊提交按鈕(可通過JavaScript控制提交按鈕點擊次數)等等。
在
Servlet里,實現
客戶端重定向的方法是:
response.sendRedirect()
Dispatch(服務器端重定向)
Dispatch(Forward)指的是服務器在處理request的過程中將request先后
委托多個servlet或jsp接替進行處理的過程。
最為常見的是先由一個Servlet處理(比如實現業務邏輯的計算),然后
forward給一個JSP進行視圖的渲染。
在Servlet里,實現dispatch是通過RequestDispatchers來實現的,而
這個類有兩個方法,
一個是forward,另一個是include,相應的在JSP里
實現dispatch的標簽也有兩個:<jsp:forward/>和<jsp:include/>.
不管是forward還是include,我們可以清楚的看到,從一個servlet或jsp向別一個servlet或jsp跳轉,request和reponse始終
在期間傳遞???,這是服務器端能實現dispatch模式的關鍵。換句話說,我們可以把request和reponse看作是
一種資源,一系列的servlet和jsp都是在
基於同一份資源(同一組request和response對象)完成它們職責范圍之內的計算。


注:此圖原圖引自《Head First Servlets and JSP》
