1 定義
- forward():表示在服務(wù)器端從一個(gè)Servlet中將請(qǐng)求轉(zhuǎn)發(fā)到另一個(gè)資源(Servlet、Jsp或Html等)纸型,本意是讓第一個(gè)組件對(duì)請(qǐng)求做些預(yù)處理(或者什么都不做)绑青,而讓另一組件處理并返回響應(yīng)履因。
- include():表示在響應(yīng)中包含另一個(gè)資源(Servlet概龄、Jsp或Html等)的響應(yīng)內(nèi)容丐谋,最終被包含的頁(yè)面產(chǎn)生的任何響應(yīng)都將并入原來(lái)的response對(duì)象芍碧,然后一起輸出到客戶端。
2 關(guān)于狀態(tài)碼和響應(yīng)頭
- forward():調(diào)用者和被調(diào)用者設(shè)置的狀態(tài)碼和響應(yīng)頭都不會(huì)被忽略号俐。
- include():被調(diào)用者(如被包含的Servlet)不能改變響應(yīng)消息的狀態(tài)碼和響應(yīng)頭泌豆,即會(huì)忽略被調(diào)用者設(shè)置的狀態(tài)碼和響應(yīng)頭。
3 誰(shuí)負(fù)責(zé)發(fā)回響應(yīng)
- forward():表示轉(zhuǎn)發(fā)吏饿,則控制權(quán)也同時(shí)交給了另一個(gè)組件踪危,所以最終由另一組件返回響應(yīng)。
- include():表示包含猪落,則控制權(quán)還在自己身上贞远,所以最終還是由自己返回響應(yīng)。
4 請(qǐng)求轉(zhuǎn)發(fā)后的代碼是否執(zhí)行许布?
- forward():轉(zhuǎn)發(fā)后還會(huì)返回主頁(yè)面繼續(xù)執(zhí)行兴革,但不可以繼續(xù)輸出響應(yīng)信息绎晃。
- include():轉(zhuǎn)發(fā)后還會(huì)返回主頁(yè)面繼續(xù)執(zhí)行蜜唾,仍然可以繼續(xù)輸出響應(yīng)信息。
5 關(guān)于forward()庶艾,引用JavaEE文檔中的說(shuō)明:
- 必須在響應(yīng)被提交到客戶端(刷新響應(yīng)正文輸出到流中)前調(diào)用forward(即在調(diào)用forward之前必須清空響應(yīng)緩沖區(qū))袁余,否則會(huì)拋出IllegalStateException異常。
- 在forward之前咱揍,響應(yīng)緩沖區(qū)中未提交的數(shù)據(jù)會(huì)被自動(dòng)清除颖榜。所以容器將忽略原Servlet所有其他輸出。
6 補(bǔ)充說(shuō)明:關(guān)于Servlet中的輸出緩沖區(qū)
- 在Servlet中使用ServletOutputStream和PrintWriter輸出響應(yīng)正文時(shí),數(shù)據(jù)首先被寫入到Servlet引擎提供的一個(gè)輸出緩沖區(qū)中掩完。直到滿足以下條件之一時(shí)噪漾,Servlet引擎才會(huì)吧緩沖區(qū)中的內(nèi)容真正發(fā)送到客戶端。
- 輸出緩沖區(qū)被填滿且蓬。
- Servlet已經(jīng)寫入了所有的響應(yīng)內(nèi)容欣硼。
- Servlet調(diào)用響應(yīng)對(duì)象的flushBuffer()方法,強(qiáng)制地將緩沖區(qū)內(nèi)的響應(yīng)正文數(shù)據(jù)發(fā)送到客戶端恶阴。
- Servlet調(diào)用ServletOutputStream或PrintWriter對(duì)象的flush()方法或close()方法诈胜。
- 為了確保ServletOutputStream或PrintWriter輸出的所有數(shù)據(jù)都能被提交給客戶端,建議在所有數(shù)據(jù)都輸出完畢后冯事,調(diào)用ServletOutputStream或PrintWriter的close()方法焦匈。
- 使用輸出緩沖區(qū)后,Servlet引擎就可以將響應(yīng)狀態(tài)行昵仅、各響應(yīng)頭和響應(yīng)正文嚴(yán)格按照HTTP消息的位置順序進(jìn)行調(diào)整后再輸出到客戶端缓熟。
- 如果在提交響應(yīng)到客戶端時(shí),輸出緩沖區(qū)中已經(jīng)裝入了所有的響應(yīng)內(nèi)容摔笤,Servlet引擎將計(jì)算響應(yīng)正文部分的大小并自動(dòng)設(shè)置Content-Length頭字段荚虚。
- 緩沖區(qū)自動(dòng)刷新(清出)功能。(注意是刷新(flush)籍茧,而不是清除(flushBuffer))
- 如果設(shè)置為自動(dòng)刷新版述,則在緩沖區(qū)滿或者使用flush()方法顯式清出時(shí),都會(huì)向客戶端輸出信息寞冯。
- 如果設(shè)置為不自動(dòng)刷新渴析,則必須明確使用flush()方法清出數(shù)據(jù),否則如果緩沖區(qū)滿了的話吮龄,將會(huì)產(chǎn)生IOException異常俭茧。
- 使用緩沖區(qū)能夠減少數(shù)據(jù)傳輸?shù)拇螖?shù),提高程序的運(yùn)行效率漓帚。但也有可能產(chǎn)生響應(yīng)延遲的問(wèn)題母债,因?yàn)樵诰彌_區(qū)滿或使用flush()顯示清出之前,數(shù)據(jù)并不會(huì)真正發(fā)送到客戶端尝抖。