HttpServletResponse接口


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 {
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
//獲得username請求參數
String username=request.getParameter("username");
    /*字符編碼轉換。
HTTP請求的默認字符編碼為ISO-8859-1,如果請求中包含中文,
需要把它轉換為GB2312中文編碼。*/
    if(username!=null)
username=new String(username.getBytes("ISO-8859-1"),"GB2312");
    if(username==null){
//僅僅為了演示response.sendError()的用法。
response.sendError(response.SC_FORBIDDEN);
return;
}
    //設置HTTP響應的正文的MIME類型及字符編碼
response.setContentType("text/html;charset=GB2312");
    /*輸出HTML文檔*/
PrintWriter out = response.getWriter();
out.println("<html><head><title>HelloServlet</TITLE></head>");
out.println("<body>");
out.println("你好: "+username);
out.println("</body></html>");
    System.out.println("before close():"+response.isCommitted()); //false
out.close(); //關閉PrintWriter
System.out.println("after close():"+response.isCommitted()); //true
}
}

Tips

為了節省篇幅,本書列出的部分類的源代碼省略了開頭的 package 語句和import語句。在本書附贈光盤中提供了范例的完整源代碼。

以上HelloServlet類利用HttpServletResponse對象的setContentType()方法來設置響應正文的MIME類型及字符編碼。“text/html”表示響應正文為HTML文檔,“GB2312”表示響應正文采用中文字符編碼。以下3種方式是等價的,都能設置HTTP響應正文的MIME類型及字符編碼:

//方式一
response.setContentType("text/html;charset=GB2312");
//方式二
response.setContentType("text/html");
response.setCharacterEncoding("GB2312");
//方式三
response.setHeader("Content-type","text/html;charset=GB2312");

HelloServlet類的service()方法最后調用PrintWriter對象的close()方法關閉底層輸出流,該方法在關閉輸出流之前會先把緩沖區內的數據提交到客戶端。因此在調用PrintWriter 對象的 close()方法之前,response.isCommitted()方法返回 false;而在調用PrintWriter對象的close()方法之后,response.isCommitted()方法返回true。HelloServlet類的service()方法中的“System.out.println(…)”語句把內容打印到Tomcat服務器所在的控制台。


免責聲明!

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



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