(1)請求轉發:
this.getServletContext().getRequestDispatcher("").forward(request,response);
request.getRequestDispatcher("").forward(request,response);
~請求轉發是希望將請求交給另外一個資源執行,所以應該保證只有最后真正要執行的資源才能夠輸出數據,所以:
*請求轉發時,如果已經有數據被寫入到了response的緩沖區,但是這些數據還沒有被發送到客戶端,則請求轉發時,這些數據將會被清空.但是清空的只是響應中的實體內容部分,頭信息並不會被清空.
Demo5:
Demo6:
*而請求轉發時已經有數據被打給了瀏覽器,那么再進行請求轉發,不能成功,會拋出異常,原因是響應已經結束了,再轉發交給其他人沒意義了
修改Demo5:
*在最終輸出數據的Servlet執行完成后,response實體內容中的數據將會被設置為已提交的狀態,再往里寫數據也不會起作用
-------使用以上三條,就保證了最終只有一個Servlet能夠向瀏覽器輸出數據,所以
*一個Servlet里兩次請求轉發也是不可以的,一次請求交給兩人處理自然也是不行.
另外 千萬不要做循環的轉發,比如從Demo5轉發到Demo6,再從Demo6轉發到Demo5,會造成不停的循環異常
(2)請求包含:將兩個資源的輸出進行合並后輸出
this.getServletContext().getRequestDispatcher("").include(request,response);
request.getRequestDispatcher("").include(request,response);
*被包含的Servlet程序不能改變響應消息的狀態碼和響應頭,如果它里面存在這樣的語句,這些語句的執行結果將被忽略
*常被用來進行頁面布局
(3)三種資源處理方式的區別
請求重定向
response.sendRedirect();
請求轉發
request.getRequestDispatcher().forward();
請求包含
request.getRequestDispatcher().include();
請求重定向和請求轉發的區別:
請求重定向地址欄會發生變化.請求轉發地址欄不發生變化.
請求重定向兩次請求兩次響應.請求轉發一次請求一次響應.
如果需要在資源跳轉時利用request域傳遞域屬性則必須使用請求轉發
如果希望資源跳轉后修改用戶的地址欄則使用請求重定向
如果使用請求轉發也可以重定向也可以,則優先使用請求轉發,減少瀏覽器對服務器的訪問次數減輕服務器的壓力.