20160326 javaweb 請求轉發和請求包含


(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域傳遞域屬性則必須使用請求轉發
如果希望資源跳轉后修改用戶的地址欄則使用請求重定向
如果使用請求轉發也可以重定向也可以,則優先使用請求轉發,減少瀏覽器對服務器的訪問次數減輕服務器的壓力.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM