重定向:位址欄有變化,一個Servlet,是二個請求
轉發:位址欄沒變化,至少2個Servlet,是一個請求(留頭不留體,意思就是最好不要體(因為你都去叫别人幫忙了,你還做點事,那還不如不叫别人幫忙呢,自己做得了),留個頭就行了,這個頭用HttpWatch可以在重新整理頁面是看到)
包含:與轉發的差別就是又留頭又留體(意思是叫别人幫忙時,你自己也做點事情)
就比如:你的上司叫你做事,你對上司說這事我做不了,您去找李四做吧,這叫重定向(估計明天上司就叫你别來了)
你的上司叫你做事,你對上司說行(其實自己不行),然後自己悄悄的去找李四幫自己做,這叫轉發,如果自己也做點,那就叫包含。
重定向小結
l 重定向是兩次請求;
l 重定向的URL可以是其他應用,不局限于目前應用;
l 重定向的響應頭為302,并且必須要有Location響應頭;
l 重定向就不要再使用response.getWriter()或response.getOutputStream()輸出資料,不然可能會出現異常;
request擷取請求參數
最為常見的用戶端傳遞參數方式有兩種:
l 浏覽器位址欄直接輸入:一定是GET請求;
l 超連結:一定是GET請求;
l 表單:可以是GET,也可以是POST,這取決與<form>的method屬性值;
GET請求和POST請求的差別:
l GET請求:
Ø 請求參數會在浏覽器的位址欄中顯示,是以不安全;
Ø 請求參數長度限制長度在1K之内;
Ø GET請求沒有請求體,無法通過request.setCharacterEncoding()來設定參數的編碼;
l POST請求:
Ø 請求參數不會顯示浏覽器的位址欄,相對安全;
Ø 請求參數長度沒有限制;
請求轉發與請求包含比較
l 如果在AServlet中請求轉發到BServlet,那麼在AServlet中就不允許再輸出響應體,即不能再使用response.getWriter()和response.getOutputStream()向用戶端輸出,這一工作應該由BServlet來完成;如果是使用請求包含,那麼沒有這個限制;
l 請求轉發雖然不能輸出響應體,但還是可以設定響應頭的,例如:response.setContentType(”text/html;charset=utf-8”);
l 請求包含大多是應用在JSP頁面中,完成多頁面的合并;
l 請求轉發大多是應用在Servlet中,轉發目标大多是JSP頁面;
請求轉發與重定向比較
l 請求轉發是一個請求,而重定向是兩個請求;
l 請求轉發後浏覽器位址欄不會有變化,而重定向會有變化,因為重定向是兩個請求;
l 請求轉發的目标隻能是本應用中的資源,重定向的目标可以是其他應用;
l 請求轉發對AServlet和BServlet的請求方法是相同的,即要麼都是GET,要麼都是POST,因為請求轉發是一個請求;
l 重定向的第二個請求一定是GET;
有時一個請求需要多個Servlet協作才能完成,是以需要在一個Servlet跳到另一個Servlet!
> 一個請求跨多個Servlet,需要使用轉發和包含。
> 請求轉發:由下一個Servlet完成響應體!目前Servlet可以設定響應頭!(留頭不留體,即使設定了響應體)
> 請求包含:由兩個Servlet共同未完成響應體!(都留)
> 無論是請求轉發還是請求包含,都在一個請求範圍内!使用同一個request和response!
* request域
Servlet中三大域對象:request、session、application,都有如下三個方法:
> void setAttribute(String name, Object value)
> Object getAttribute(String name)
> void removeAttribute(String name);
> 同一請求範圍内使用request.setAttribute()、request.getAttribute()來傳值!前一個Servlet調用setAttribute()儲存值,後一個Servlet調用getAttribute()擷取值。
總之:重定向:位址欄有變化,一個Servlet,是二個請求
轉發:位址欄沒變化,至少2個Servlet,是一個請求(留頭不留體,意思就是最好不要體,留個頭就行了)
就比如:你的上司叫你做事,你對上司說這事我做不了,您去找李四做吧,這叫重定向
你的上司叫你做事,你對上司說行(其實自己不行),然後自己悄悄的去找李四幫自己做,這叫轉發