20160326 javaweb 請求轉發和請求包含

破玉發表於2016-03-26

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

相關文章