1. 响应对象概述

响应,它表示了服务器端收到请求,同时也已经处理完成,把处理的结果告知用户。简单来说,指的就是服务器把请求的处理结果告知客户端。在B/S架构中,响应就是把结果带回浏览器。响应对象就是用来实现上述功能的对象。

响应结果要么成功要么失败,分类如下:

常用状态码:

状态码

说明

200

执行成功

302

它和307一样,都是用于重定向的状态码。3开头:重定向

304

请求资源未改变,使用缓存。

400

请求错误。最常见的就是请求参数有问题。4开头:客户端错误

404

请求资源未找到

405

请求方式不被支持

500

服务器运行内部错误。5开头:服务器错误

2. 字节流响应消息并解决乱码问题

/*字节流响应消息*/
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //指定浏览器采用的编码格式
        resp.setContentType("text/html; charset=UTF-8");

        //获取字节输出流对象
        ServletOutputStream os = resp.getOutputStream();
        //定义一个消息
        String str = "落霞与孤鹜齐飞,秋水共长天一色";
        //因为是Windows系统,所以getByte默认采用的是gbk字符集将字符串转化为字节数组
        //指定将消息转换为utf-8编码的字节流,此时需要解决中文乱码问题
        byte[] bytes = str.getBytes("UTF-8");
        //通过字节流对象在浏览器输出消息
        os.write(bytes);
        //通过响应对象获取的流对象不需要自己关闭
        //os.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

3. 字符流响应消息和解决乱码问题

/*字符流响应消息*/
@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //指定浏览器采用的编码格式
        resp.setContentType("text/html; charset=UTF-8");

        //获取字符输出流对象
        PrintWriter printWriter = resp.getWriter();
        String str = "风萧萧兮易水寒";
        //通过字符流输出到浏览器
        printWriter.write(str);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

4. 响应图片

/*响应图片*/
@WebServlet("/servletDemo03")
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建输入流对象,关联图片所在路径(/web/img/01.jpg)
        //图片路径需要为绝对路径
        ServletContext context = getServletContext();
        String realPath = context.getRealPath("/img/01.jpg");
        FileInputStream fileInputStream = new FileInputStream(realPath);
        BufferedInputStream bs = new BufferedInputStream(fileInputStream);
        //通过响应对象获取字节输出流
        ServletOutputStream os = resp.getOutputStream();
        //循环读写
        byte[] bytes = new byte[1024];
        int len;
        while ((len=bs.read(bytes))!=-1){
            os.write(bytes,0,len);
        }
        //只需关闭输入流
        bs.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

5. 设置缓存时间

/*设置缓存*/
@WebServlet("/servletDemo04")
public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String str = "马作的卢飞快,弓如霹雳弦惊";
        //设置1小时缓存,第一次请求走服务端,过后1小时内再次访问,都是从缓存拿数据
        //ie浏览器测试
        resp.setDateHeader("Expires", System.currentTimeMillis()+60*60*1000);
        //设置编码格式
        resp.setContentType("text/html; charset=UTF-8");
        //写数据
        resp.getWriter().write(str);
        //第一次访问服务区会显示,之后在地址栏回车控制台不会显示
        System.out.println("冷冷清清,凄凄惨惨戚戚");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

6. 设置定时刷新

/*定时刷新*/
@WebServlet("/servletDemo05")
public class ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String str = "您的用户名或密码有误,3秒后自动跳转到登录页面";
        //设置编码格式
        resp.setContentType("text/html; charset=UTF-8");

        //写出数据
        resp.getWriter().write(str);
        //设置定时刷新时间和跳转路径
        resp.setHeader("Refresh","3;URL=/response/login.html");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

7. 重定向

重定向:客户端的一次请求到达后,需要借助其他Servlet来实现功能

特点:浏览器地址栏会发生改变,两次请求,请求域对象中不能共享数据,可以重定向到其他服务器

/*重定向*/
@WebServlet("/servletDemo06")
public class ServletDemo06 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletDemo06执行了。。。。。");
        //设置一个共享数据
        req.setAttribute("username", "yulu");

        //重定向(虚拟路径+映射路径)
        resp.sendRedirect(req.getContextPath()+"/servletDemo07");
        //还可以重定向到其他服务器
       // resp.sendRedirect("https://www.baidu.com/");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
/*重定向*/
@WebServlet("/servletDemo07")
public class ServletDemo07 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servletDemo07执行了。。。。。");
        //尝试获取共享数据
        Object username = req.getAttribute("username");
        System.out.println(username);//null
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

8. 文件下载

@WebServlet("/servletDemo08")
public class ServletDemo08 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.创建字节输入流,关联读取的文件
        //获取文件的绝对路径
        String realPath = getServletContext().getRealPath("/img/01.jpg");
        //创建字节输出流对象
        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=  消息头参数  附件形式进行处理
         */
        resp.setHeader("Content-Disposition","attachment;filename=" + System.currentTimeMillis() + ".png");

        //4.获取字节输出流对象
        ServletOutputStream sos = resp.getOutputStream();

        //5.循环读写文件
        byte[] arr = new byte[1024];
        int len;
        while((len = bis.read(arr)) != -1) {
            sos.write(arr,0,len);
        }

        //6.释放资源
        bis.close();
        sos.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

如有错误欢迎留言评论,2021年7月7日  羽露风