HttpServletResponse接口是ServletResponse的子接口,HttpServlet類的重載service()方法及doGet()和doPost()等方法都有一個HttpServletResponse類型參數:
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
HttpServletResponse 接口提供了與 HTTP 協議相關的一些方法,Servlet 可通過這些方法來設置HTTP響應頭或向客戶端寫Cookie。
addHeader(String name, String value):向HTTP響應頭中加入一項內容。
sendError(int sc):向客戶端發送一個代表特定錯誤的HTTP響應狀態代碼。
sendError(int sc, String msg):向客戶端發送一個代表特定錯誤的HTTP響應狀態代碼,並且發送具體的錯誤消息。
setHeader(String name, String value):設置HTTP響應頭中的一項內容。如果在響應頭中已經存在這項內容,那么原先所做的設置將被覆蓋。
setStatus(int sc):設置HTTP響應的狀態代碼。
addCookie(Cookie cookie):向HTTP響應中加入一個Cookie。
在HTTPServletResponse接口中定義了一些代表HTTP響應狀態代碼的靜態常量,如下所示。
HTTPServletResponse. SC_BAD_REQUEST:對應的響應狀態代碼為400。
HTTPServletResponse. SC_FOUND:對應的響應狀態代碼為302。
HTTPServletResponse. SC_METHOD_NOT_ALLOWED:對應的響應狀態代碼為405。
HTTPServletResponse. SC_NON_AUTHORITATIVE_INFORMATION:對應的響應狀態代碼為203。
HTTPServletResponse. SC_FORBIDDEN:對應的響應狀態代碼為403。
HTTPServletResponse. SC_NOT_FOUND:對應的響應狀態代碼為404。
HTTPServletResponse. SC_OK:對應的響應狀態代碼為200。
例程4-4的HelloServlet類的doGet()方法先得到username請求參數,對其進行中文字符編碼轉換,然后判斷username參數是否為null。如果滿足條件,就直接返回一個代表特定錯誤的 403 響應狀態代碼;否則,就通過 HttpServletResponse 對象的getWriter()方法得到一個PrintWriter對象,然后通過PrintWriter對象來輸出一個HTML文檔。
例程4-4 HelloServlet.java
public class HelloServlet extends HttpServlet { /*字符編碼轉換。 if(username!=null) if(username==null){ //設置HTTP響應的正文的MIME類型及字符編碼 /*輸出HTML文檔*/ System.out.println("before close():"+response.isCommitted()); //false |
Tips
為了節省篇幅,本書列出的部分類的源代碼省略了開頭的 package 語句和import語句。在本書附贈光盤中提供了范例的完整源代碼。
以上HelloServlet類利用HttpServletResponse對象的setContentType()方法來設置響應正文的MIME類型及字符編碼。“text/html”表示響應正文為HTML文檔,“GB2312”表示響應正文采用中文字符編碼。以下3種方式是等價的,都能設置HTTP響應正文的MIME類型及字符編碼:
//方式一 |
HelloServlet類的service()方法最后調用PrintWriter對象的close()方法關閉底層輸出流,該方法在關閉輸出流之前會先把緩沖區內的數據提交到客戶端。因此在調用PrintWriter 對象的 close()方法之前,response.isCommitted()方法返回 false;而在調用PrintWriter對象的close()方法之后,response.isCommitted()方法返回true。HelloServlet類的service()方法中的“System.out.println(…)”語句把內容打印到Tomcat服務器所在的控制台。