Servlet学习笔记之HttpServletResponse详解

对于一个Servlet在每次请求访问时,Servlet引擎都会创建一个描述请求消息和一个描述响应消息的对象。其中描述请求消息的对象实现了HttpServletRequest接口,而描述响应消息的对象实现了HttpServletResponse接口。

我们可以使用HttpServletResponse对象产生3种HTTP响应消息:状态行、响应消息头、响应正文。

Servlet引擎在创建了这2个对象之后,就会调用此Servlet对象的service方法来处理各种HHTP请求。

 

一、产生状态响应码

 

状态响应码存在于HTTP相应消息头的第一行,即状态行,如下所示:

HTTP/1.1  200  OK

 状态行分为3部分:HTTP版本、状态代码、状态消息

 

HTTP协议的状态响应码为3位整数,分为5类:

  1. 100~199:表示服务器成功接收请求,但要求客户端继续提交下一次请求才能完成全部处理过程。
  2. 200~299:表示服务端已成功接收请求,并完成了全部处理过程。
  3. 300~399:表示客户端请求的资源已经转移到了别的位置,并向客户端提供一个新的地址,这个地址由HTTP响应消息头的location字段指定。
  4. 400~499:表示客户端的请求有错误。
  5. 500~599:表示服务端出现错误。
设置状态响应码: 1、setStatus(int  sc) sc表示状态码,它既可以直接使用整数形式,也可以使用在HttpServletResponse中定义的常量。 setStatus方法可以设置任何HTTP响应消息的状态码,并生成相应状态行。 由于响应状态行中的协议版本和状态消息是由服务器决定的,因此只需设置状态响应码就可以了。 2、sendRedirect(String  location) location指定重定向的URL,该URL既可以是绝对的(http://www.baidu.com),也可以是相对的。 该方法用更快捷的方式来设置响应状态吗302,表示需要客户端重定向URL。 3、sendError
public  void  sendError (int  sc)  throws  IOException
public  void  sendError (int  sc, String  msg)  throws  IOException
 该方法用于发送表示错误消息的状态码(也就是400~599之间的状态码),而且还可以设置状态消息。 二、设置响应消息头
HTTP 响应消息头部实例:

Status:OK - 200 
Date:Sun, 01 Jun 2008 12:35:47 GMT
Server:Apache/2.0.61 (Unix)
Last-Modified:Sun, 01 Jun 2008 12:35:30 GMT
Accept-Ranges:bytes
Content-Length:18616
Cache-Control:max-age=120
Expires:Sun, 01 Jun 2008 12:37:47 GMT
Content-Type:application/xml
Age:2
X-Cache:HIT from 236-41.D07071951.sina.com.cn 
Via:1.0 236-41.D07071951.sina.com.cn:80 (squid/2.6.STABLE13)
Connection:close 
 1、addHeader与setHeader方法
public void addHeader(String name, String value);
public void setHeader(String name, String value);
//name表示字段名,value表示字段值
 注意: 1、如果name所指定的字段名已经存在,setHeader会用value来覆盖旧的字段值,而addHeader会      增加一个同名的字段(HTTP响应消息头允许存在多个同名的字段)。 2、name参数不区分大小写。 2、addIntHeader与setIntHeader方法 response提供了2个专门设置整形字段值的方法,这2个方法的区别与addHeader和setHeader相同。
public void addIntHeader(String name, int value);
public void setIntHeader(String name, int value);
//name表示字段名,value表示字段值
  3、addDateHeader与setDateHeader方法 response提供了2个专门设置日期字段值的方法,这2个方法的区别与addHeader和setHeader相同。
public void addDateHeader(String name, long date);
public void setDateHeader(String name, long date);
//name表示字段名,date表示字段值
 HTTP响应头中的日期一般为GMT时间格式,这2个方法省去了将字1970年1月1日0时0分0秒开始计算的一个以毫秒为单位的长整形数值转换为GMT时间字符串的麻烦。 4、setContextType 该方法设置Content-Type字段的值。(即设置MIME类型)
public void setContentType(String type)
 如:response.setContentType("text/html;charset=GBK"); 5、setCharacterEncoding
public void setCharacterEncoding(String ecode)
 这个方法实际上是设置Content-Type字段的字符集部分。 注意: 在使用这个方法之前,如果Content-Type不存在,则必须先添加Content-Type,否则该方法设置的字符集类型也不会出现在响应消息头上。 6、setContentLength 该方法用于设置相应正文的大小,单位是字节。 Servlet引擎会根据向客户端实际输出的响应正文的大小自动设置Content-Length字段的值。 7、containsHeader
public boolean containsHeader(String name)
 该方法用于检查某个字段是否在响应消息头中存在,如果存在,则返回true,否则返回false。   三、产生响应正文 为了向客户端返回响应正文,response提供了2个方法:getWriter()和getOutputStream()。 getWriter方法返回一个字符输出流对象,getOutputStream方法返回一个字节输出流对象。 这2个方法是互斥的,也就是说,调用一个方法后就不能再调用另一个方法。 1、getWriter
public PrintWriter getWriter() throws IOException
 如果响应正文全部是字符文本,并且需要进行编码转换,建议使用gatWriter方法。 从getWriter方法返回的PrintWriter对象不仅能很方便的向客户端返回相应正文,而且还会根据响应消息头的Content-Type所指定的字符编码格式自动转换响应正文(PrintWriter返回的响应正文是编码转换后的文本)。
//示例
response.setContentType("text/html;charser=utf-8");
PrintWriter out = response.getWriter();
out.println("中国");
 注意: 如果不指定相应正文的编码格式,PrintWriter就会按ISO8859-1字符集编码格式进行转换,而ISO8859-1无法对中文进行编码,就会导致乱码。 建议尽量手动关闭PrintWriter对象(虽然Servlet引擎会自动关闭PrintWriter对象)。   2、getOutputStream
public ServletOutputStream getOutputStream() throws  IOException;
 如果响应正文是非字符文本的数据或者是不需要进行编码转换的字符文本,建议使用字节输出流的方式返回响应正文。 使用ServletOutputStream返回字符文本: 1、将字符文本的响应正文转换为字节后返回
OutputStream out = response.getOutputStram();
out.write("中国".getBytes());
 如果想用其他的字符编码格式发送响应正文,需要通过getBytes方法获得字符串的相应字符编码格式的字符流。
response.setContentType("text/html;charset=utf-8");
OutputStream out = response.getOutputStream();
out.write("中国".getBytes("utf-8"));
  2、将字节流转换为OutputStreamWriter后直接输出字符文本。
OutputStream out = response.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(out);
writer.write("中国");
writer.close();//这行必须写,否则无法输出响应正文
  四、重定向
response.sendRedirect("http://www.baidu.com");
 

猜你喜欢

转载自guoying252166655.iteye.com/blog/2041373