HttpServletResponse概述、常见状态码、发送状态码的方法、设置缓存时间及文件下载

目录

一、HttpServletResponse概述

二、常见状态码

三、发送状态码、发送响应头的方法

发送状态码的方法:

发送响应头的方法:

四、发送响应消息体的方法及请求重定向

发送响应消息体的方法

请求重定向

五、设置缓存时间及设置定时刷新

设置缓存时间

设置定时刷新

六、文件下载


一、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);
    }
}

版权声明:本文为m0_61961937原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。