HttpServletResponse是专门用于HTTP协议的ServletResponse接口,它用于封装HTTP响应消息,允许操控HTTP协议相关数据,包括响应头和状态码,支持Cookies和session跟踪,HttpServletResponse也定义了一系列用于描述各种HTTP状态码的常量。
WEB服务器回送给WEB客户端的HTTP响应消息分为三部分,状态行、响应消息头 和 消正文(也叫实体内容)。
HttpServletResponse中定义了几个用于产生HTTP消息的响应状态行的方法和对应各个响应状态码的常量。***
public void sendError(int code) throws java.io.IOException
public void sendError(int code,String message)throws java.io.IOException
在上面重载的两个方法中,第一个方法只发送错误信息的状态码,而第二个方法除了发送状态码以外,还可以增加一条用于提示说明的文本信息,该文本信息将出现在发送给客户端的正文内容中。
方法声明 | 功能描述 |
---|---|
void addIntHeader(String name,int value) | 这两个方法都是用于设置 HTTP 协议的响应头字段。其中,参数 name 用于指定响应头字段的名称,参数 value 用于指定响 应头字段的值。不同的是,addHeader() 方法可以增加同名的响应头字段(HTTP响应消息中允许同一名称的头字段出现多次),而 setHeader() 方法则会覆盖同名的头字段 |
void setIntHeader(String name, int value) | |
void addIntHeader(String name,int value) | 这两个方法专门用于设置包含整数值的响应头,避免了使用 addHeader() 与 setHeader() 方法时需要将 int 类型的设置值转换为 String 类型的麻烦 |
void setIntHeader(String name, int value) | |
void addDataHeader(String name,long date) | 这两个方法专门用于设置包含日期值的响应头,HTTP响应头中的日期通常都为GMT格式,避免了以毫秒为单位的长整数转换为GMT时间串的麻烦 |
void setDataHeader(String name, long date) | |
void setContentLength(int len) | 设置响应中内容主体的长度。在HTTP servlet中,此方法设置HTTP Content-Length标头。参数:len-一个整数,指定要返回给客户端的内容的长度;设置Content-Length标头 |
void setContentType(String type) | 该方法用于设置 Servlet 输出内容的 MIME 类型,对于 HTTP 协议来说,就是设置 Content-Type 响应头字段的值。例如,如果发送到客户端的内容是 jpeg 格式的图像数据,就需要将响应头字段的类型设置为 image/jpeg。需要注意的是,如果响应的内容为文本,setContentType() 方法还可以设置字符编码,如 text/html;charset = UTF-8 |
void setLocale (Locale loc) | 该方法用于设置响应消息的本地化信息。对 HTTP 来说,就是设置 Content-Language 响应头字段和 Content-Type 头字段中的字符集编码部分。需要注意的是,如果 HTTP 消息没有设置 Content-Type 头字段,则 setLocale() 方法设置的字符集编码不会出现在 HTTP 消息的响应头中,如果调用 setCharacterEncoding() 或 setContentType() 方法指定了响应内 容的字符集编码,则 setLocale() 方法将不再具有指定字符集编码的功能 |
void setCharacterEncoding(String charset) | 该方法用于设置输出内容使用的字符编码,对 HTTP 协议来说,就是设置 Content-Type 头字段中的字符集编码部分。如果没有设置 Content-Type 头字段,则 setCharacterEncoding 方法设 置的字符集编码不会出现在 HTTP 消息的响应头中。setCharacterEncoding() 方法比 setContentType() 和 setLocale() 方法的优先权高,它的设置结果将覆盖 setContentType() 和 setLocale() 方法所设置的字符码表 |
*此外containsHeader方法用于检查某个名称的头字段是否已经被设置。*
response.setDateHeader("Expires",0);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
发送响应消息体相关的方法 由于在 HTTP 响应消息中,大量的数据都是通过响应消息体传递的,因此,ServletResponse 遵循以 I/O 流传递大量数据的设计理念。在发送响应消息体时,定义了两个与输出流相关的方法。 1)getOutputStream() 方法 该方法所获取的字节输出流对象为 ServletOutputStream 类型。由于 ServletOutputStream是OutputStream 的子类,它可以直接输出字节数组中的二进制数据。因此,要想输出二进制格式的响应正文,就需要使用 getOutputStream() 方法。 2)getWriter() 方法 该方法所获取的字符输出流对象为 PrintWriter 类型。由于 PrintWriter 类型的对象可以直接输出字符文本内容,因此,要想输出内容全部为字符文本的网页文档,则需要使用 getWriter() 方法。 注意1:虽然 response 对象的 getOutputStream() 和 getWriter() 方法都可以发送响应消息体,但是,它们之间互相排斥,不可同时使用,否则会发生 IllegalStateException 异常。 注意2:虽然Servlet的sercice方法结束后,Servlet引擎会检查这两个方法返回的输出流对象有没有调用close方法,没有会帮忙调一下,但是作为Servlet开发人员最好还是把close方法加上,以便尽快释放相关资源。 3)输出缓存区 Servlet程序输出的HTTP消息的响应正文不是直接发送到客户端,而是首先被写入到了Servlet引擎提供的输出缓存区中,这个缓存区就跟个蓄水池似地,要等被填满或者Servlet程序写完了所有响应内容,缓存区的内容才会被发送到客户端。 setBufferSize方法: 设置期望的输出缓冲区大小 getBufferSize方法: 返回Servlet引擎实际使用的缓冲区大小 flushBuffer方法: 将输出缓冲区内容强制输出到客户端 reset方法: 清空输出缓存区的内容 isCommitted方法: 判断是否提交到了客户端 4)实现动态文件内容下载:当要下载的文件不是真正存在与WEB服务器的文件系统中,而是需要用一个Servlet程序临时在服务器内存中动态产生后再传送到客户端。 servlet程序必须告诉浏览器其所输出的内容的类型不是普通文本文件或者HTML文件,而是一个淘宝村到本地的下载文件,这就需要HttpServletResponse.setContentType方法来设置Content-Type头字段的值为浏览器无法使用某种方式活着激活某种程序来处理的MIME类型,例如"application/octet-stream"; 通过HttpServletResponse.setHeader方法设置Content-Disposition头的值为"attachment;filename=文件名"; 因为附件可以是各种文件类型文件,需将附件文件内容传至客户端,其中内容当作二进制处理,所以当调用HttpServletResponse.getOutputStream方法返回的ServletOUtputStream对象来想客户端写入附件内容 5)图像访问计数器:统计和显示页面的访问次数是一个常见的WEB应用,因为在网页每次被访问时,页面的访问次数都要发生改变,所以这个功能必须通过服务器端的程序来实现。具体内容:略;