一、HttpServletResponse概述
● HttpServletResponse接口继承自ServletResponse接口
● 用于封装HTTP响应消息
● HTTP响应消息分为响应行,响应头,响应体三部分,所以HttpServletResponse中定义了向客户端发送响应状态码、响应消息头、响应消息体等方法
二、常见状态码
状态码 | 说明 |
200 | 成功 |
302 | 重定向 |
304 | 请求资源未改变,使用缓存 |
400 | 请求错误,常见于请求参数错误 |
404 | 请求资源未找到 |
405 | 请求方式不支持 |
500 | 服务器错误 |
三、发送状态码、发送响应头的方法
发送状态码的方法:
void setStatus(int status) ,设置响应消息的状态码,并生成响应状态行
void sendError(int sc) ,发送表示错误信息的状态码
void sendError(int sc,String message) ,设置表示错误的状态码外还向客户端发送一条错误信息,其中包含message的内容
发送响应头的方法:
1、void addHeader(String name,String value) ,设置响应头指定名称字段的值,会覆盖掉原来该名称字段的值
2、void setHeader(String name,String value) ,与addHeader()方法功能相同,但是不会覆盖原来的值而是添加一个值
3、void setContentLength(int len) ,设置响应头的实体内容的大小,单位是字节
4、void setContentType(String type) ,设置响应内容的类型,即Content-Type的值,并且响应内容为文本类型时还能指定字符集编码,如text/html;charset=UTF-8
四、发送响应消息体的方法及请求重定向
发送响应消息体的方法
1、ServletOutputStream getOutputStream() ,用于获取字节输出流对象
2、PrintWriter getWriter() ,用于获取输出流对象
3、注意:在使用这些输出流时可能会出现乱码的情况,所以在使用输出流时可以使用
resp.setContentType("text/html;UTF-8"); 来设置字符集编码,用来解决乱码问题
请求重定向
● 请求重定向是指服务器接收到客户端请求后,可能由于某些条件限制,不能访问请求指定的资源,让客户端去访问另一个指定的资源
● HttpServletResponse定义了一个sendRedirect()方法,用于生成304响应状态码和Location响应头,从而通知客户端重新访问Location响应头中指定的URL
● 方法: void sendRedirect(String location)
● location可以使用相对路径重定向到同一个Web服务器的其他Servlet,也可以绝对路径重定向到其他Web服务器
● 注意:重定向时会重新生成另一个HttpServletRequest对象,所以不能实现Servlet的共享数据,如果需要共享数据那么可以使用请求转发
五、设置缓存时间及设置定时刷新
设置缓存时间
● 对于不经常变化的数据,可以设置缓存时间减少频繁访问服务器,提高效率
● 使用 void setDateHeader(String name,long time) 方法来设置响应头
● 范例: resp.setDateHeader("Expires",System.currentTimeMills+1*60*60*1000) ,设置缓存时间为1个小时
设置定时刷新
定时刷新是指设置经过某个时间后自动跳转到某个页面
使用 void setHeader(String name,String value) 方法
范例: resp.setHeader("Refresh","3;URL=/虚拟目录/demo.html");
六、文件下载
实现在浏览器中下载文件的功能,步骤如下:
1、创建字节输入流,关联读取的文件
2、设置响应消息头支持的类型
3、设置响应消息头以下载方式打开资源
4、通过响应对象获取字节输出流对象
5、循环读写
6、释放资源
范例:
@WebServlet("/ServletDownloadDemo") public class ServletDownloadDemo extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1. 创建字节输入流,关联读取的文件 String realPath = getServletContext().getRealPath("/img/ServletLive.png"); BufferedInputStream bis = new BufferedInputStream(new FileInputStream(realPath)); //2. 设置响应消息头支持的类型 //Content-Type是消息头名称,表示支持的类型 //application/octet-stream是消息头参数,表示字节流 resp.setHeader("Content-Type","application/octet-stream"); //3. 设置响应消息头以下载方式打开资源 //Content-Disposition是消息头名称,表示处理形式 //attachment;filename=ServletLive.png是消息头参数,表示附件形式处理, filename表示文件名称 resp.setHeader("Content-Disposition","attachment;filename=ServletLive.png"); //4. 通过响应对象获得字节输出流对象 ServletOutputStream outputStream = resp.getOutputStream(); //5. 循环读写 byte[] bytes = new byte[1024]; int len; while((len = bis.read(bytes)) != -1){ outputStream.write(bytes,0,len); } //6. 释放资源 bis.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }