- 輕量級Java EE企業應用開發實戰
- 柳偉衛編著
- 1227字
- 2022-07-29 14:31:20
3.6 響應
響應對象封裝了從服務器返回客戶端的所有信息。在HTTP協議中,這些信息包含在從服務器傳輸到客戶端的HTTP頭信息或響應的消息體中。
3.6.1 緩沖
出于性能的考慮,Servlet容器允許(但不要求)從緩存中輸出內容到客戶端。一般情況下,服務器是默認執行緩存的,但也允許Servlet來指定緩存參數。
下面是ServletResponse接口允許Servlet來訪問和設置緩存信息的方法:
- getBufferSize
- setBufferSize
- isCommitted
- reset
- resetBuffer
- flushBuffer
無論Servlet使用的是一個ServletOutputStream還是一個Writer,ServletResponse接口提供的這些方法都允許執行緩沖操作。getBufferSize方法返回使用的底層緩沖區大小。如果沒有使用緩沖,該方法就必須返回一個Int值0。Servlet可以請求setBufferSize方法來設置一個最佳的緩沖大小。isCommitted方法返回一個表示是否有任何響應字節已經返回到客戶端的boolean值。flushBuffer方法強制刷出緩沖區的內容到客戶端。當響應沒有提交時,reset方法用來清空緩沖區的數據。頭信息、狀態碼和在調用reset之前Servlet調用getWriter或getOutputStream設置的狀態也必須被清空。如果響應沒有被提交,resetBuffer方法就清空緩沖區中的內容,但不清空請求頭和狀態碼。
如果響應已經提交并且reset或resetBuffer方法已被調用,就必須拋出IllegalStateException,響應及它關聯的緩沖區將保持不變。
當使用緩沖區時,容器必須立即刷出填滿的緩沖區內容到客戶端。
3.6.2 頭
Servlet可以通過下面HttpServletResponse接口的方法來設置HTTP響應頭:
- setHeader
- addHeader
setHeader方法通過給定的名字和值來設置頭。前面的頭會被后來新的頭替換。如果已經存在同名的頭集合的值,集合中的值就會被清空并用新的值替換。
addHeader方法使用給定的名字添加一個頭值到集合。如果沒有頭與給定的名字關聯,就創建一個新的集合。頭可能包含表示Int或Date對象的數據。以下HttpServletResponse接口提供的方法允許Servlet對適當的數據類型用正確的格式設置一個頭:
- setIntHeader
- setDateHeader
- addIntHeader
- addDateHeader
為了成功地傳回給客戶端,頭必須在響應提交前設置。響應提交后的頭設置將被Servlet容器忽略。
Servlet開發人員負責保證為Servlet生成的內容設置合適的響應對象的Content-Type頭。HTTP/1.1規范中沒有要求在HTTP響應中設置此頭。當Servlet程序員沒有設置該類型時,Servlet容器也不能設置默認的內容類型。
容器使用X-Powered-By HTTP頭發布其實現信息,其字段值應包含一個或多個實現類型,例如Servlet / 4.0。還可以在括號內(實現類型之后)添加容器和底層Java平臺的補充信息,當然補充信息是可選地。以下是設置“X-Powered-By”HTTP頭的示例:

3.6.3 方法
HttpServletResponse提供了如下簡便的方法:
- sendRedirect
- sendError
sendRedirect方法將設置適當的頭和內容體將客戶端重定向到另一個地址。使用相對URL路徑調用該方法是合法的,但是底層的容器必須將傳回到客戶端的相對地址轉換為全路徑URL。無論出于什么原因,如果給定的URL是不完整的,且不能轉換為一個有效的URL,那么該方法必須拋出IllegalArgumentException。
sendError方法將設置適當的頭和內容體用于給客戶端返回錯誤消息??梢允褂胹endError方法提供一個可選的String參數用于指定錯誤的內容體。
如果響應已經提交并終止,這兩個方法將對提交的響應產生負向作用。這兩個方法調用后,Servlet將不會產生到客戶端的后續輸出。這兩個方法調用后,如果有數據繼續寫到響應,這些數據就會被忽略。
如果數據已經寫到響應的緩沖區,但沒有返回到客戶端(例如,響應沒有提交),響應緩沖區中的數據就必須被清空并使用這兩個方法設置的數據替換。如果響應已提交,這兩個方法就必須拋出IllegalStateException。
- Building a RESTful Web Service with Spring
- Building a Recommendation Engine with Scala
- Bootstrap Essentials
- GeoServer Beginner's Guide(Second Edition)
- Modern JavaScript Applications
- Hands-On Full Stack Development with Go
- PHP 7從零基礎到項目實戰
- Distributed Computing in Java 9
- 分布式數據庫原理、架構與實踐
- Arduino電子設計實戰指南:零基礎篇
- Mastering Node.js
- HTML5程序開發范例寶典
- Swift從入門到精通 (移動開發叢書)
- Python機器學習
- Magento 2 Development Essentials