ServletContext可以實現請求轉發,request也可以。
在forward之前輸入到response緩沖區中的數據,如果已經被發送到了客戶端,forward將失敗,拋出異常
在forward之前輸入到response緩沖區中的數據,但是還沒有發送到客戶端,forward可以執行,但是緩沖區將被清空
,之前的數據丟失。注意丟失的只是請求體中的內容,頭內容仍然有效。
在一個Servlet中進行多次forward也是不行的,因為第一次forward結束,response已經被提交了,沒有機會再
forward了
總之,一條原則,一次請求只能有一次響應,響應提交走后,就再沒有機會輸出數據給瀏覽器了。
6.RequestDispatcher進行include操作
forward沒有辦法將多個servlet的輸出組成一個輸出,因此RequestDispatcher提供了include方法,可以將多個
Servlet的輸出組成一個輸出返回個瀏覽器
request.getRequestDispatcher("/servlet/Demo17Servlet").include(request, response);
response.getWriter().write("from Demo16");
request.getRequestDispatcher("/servlet/Demo18Servlet").include(request, response);
常用在頁面的固定部分單獨寫入一個文件,在多個頁面中include進來簡化代碼量。
請求重定向和請求轉發的區別:
請求重定向地址欄會發生變化.請求轉發地址欄不發生變化.
請求重定向兩次請求兩次響應.請求轉發一次請求一次響應.
如果需要在資源跳轉時利用request域傳遞域屬性則必須使用請求轉發
如果希望資源跳轉后修改用戶的地址欄則使用請求重定向
如果使用請求轉發也可以重定向也可以,則優先使用請求轉發,減少瀏覽器對服務器的訪問次數減輕服務器的壓力.
s