zoukankan      html  css  js  c++  java
  • HttpServletResponse ServletResponse 返回响应 设置响应头设置响应正文体 重定向 常用方法 如何重定向 响应编码 响应乱码

     
    HttpServletResponse  和 ServletResponse  都是接口
    具体的类型对象是由Servlet容器传递过来

     
    ServletResponse对象的功能分为以下四种:
            设置响应头信息;
            发送状态码;
            设置响应正文;
            重定向;
     
     
    设置响应头信息
    HttpServletResponse 中 (ServletResponse 中没有的)

    void setHeader(String var1, String var2);

    使用该方法设置的响应头最终会发送给客户端浏览器
    示例:

    response.setHeader(“content-type”, “text/html;charset=utf-8”);

    设置content-type响应头,该头的作用是:
    1. 告诉浏览器响应内容为html类型,编码为utf-8。
    2. 而且同时会设置response的字符流编码为utf-8,即response.setCharaceterEncoding(“utf-8”);

    自动跳转

    response.setHeader("Refresh","5; URL=http://www.baidu.com");

    5秒后自动跳转到百度。
     
     
     
    发送状态码以及类型
     

    response.setContentType("text/html;charset=utf-8");

    //等同与调用response.setHeader(“content-type”, “text/html;charset=utf-8”);
     

    response.setCharacterEncoding(“utf-8”);//设置字符响应流的字符编码为utf-8;

    response.setStatus(200);//设置状态码;

    response.sendError(404, “您要查找的资源不存在”);//当发送错误状态码时,Tomcat会跳转到固定的错误页面去,但可以显示错误信息。

    比如:
    response.sendError(404, "您要查找的资源不存在了哈");
     
     
     
     
    设置响应正文

    ServletResponse是响应对象,向客户端输出响应正文(响应体)可以使用ServletResponse的响应流
    repsonse一共提供了两个响应流对象:
            PrintWriter out = response.getWriter():获取字符流;
            ServletOutputStream out = response.getOutputStream():获取字节流;
    两个方法都是ServletResponse的 HttpServletResponse继承而得到
     
    注意:
    1. 当然,如果响应正文内容为字符,那么使用response.getWriter()
    2. 如果响应内容是字节,那么可以使用response.getOutputStream()  例如下载时
    在一个请求中,不能同时使用这两个流!
    也就是说,要么你使用repsonse.getWriter(),要么使用response.getOutputStream(),但不能同时使用这两个流。
    不然会抛出IllegalStateException异常。
     
     
     
     
     
    字符编码

    在使用response.getWriter()时需要注意默认字符编码为ISO-8859-1,
    如果希望设置字符流的字符编码为utf-8
    可以使用
    response.setCharaceterEncoding(“utf-8”)来设置。
    这样可以保证输出给客户端的字符都是使用UTF-8编码的!
     
    但客户端浏览器并不知道响应数据是什么编码的!
    如果希望通知客户端使用UTF-8来解读响应数据,那么还是使用
    response.setContentType("text/html;charset=utf-8")方法比较好
    因为这个方法不只会调用response.setCharaceterEncoding(“utf-8”),还会设置content-type响应头
    客户端浏览器会使用content-type头来解读响应数据。
     
     

    缓冲区

    response.getWriter()是PrintWriter类型,所以它有缓冲区,缓冲区的默认大小为8KB。

    也就是说,在响应数据没有输出8KB之前,数据都是存放在缓冲区中,而不会立刻发送到客户端。

    当Servlet执行结束后,服务器才会去刷新流,使缓冲区中的数据发送到客户端。

    如果希望响应数据马上发送给客户端:

       向流中写入大于8KB的数据;

       调用response.flushBuffer()方法来手动刷新缓冲区;

     

    重定向
     
    当你访问A网址时,你会发现浏览器地址栏URL变成了B ,这就是重定向
    所谓重定向,就是服务器重新定位你的方向,告诉你去别的地方
    是再次的发出了请求,全程总共有两个请求
     
     
    第一步就是设置响应码为302。
    响应码为200表示响应成功,而响应码为302表示重定向,你需要告诉浏览器需要重定向
    第二步设置重定向的URL
    因为重定向是通知浏览器再第二个请求,所以浏览器需要知道第二个请求的URL
    所以完成重定向的第二步是设置Location头,指定第二个请求的URL地址。
     
    response.setStatus(302);
    response.setHeader("Location", "https://www.cnblogs.com/noteless/");
    你会发现地址栏立刻进行了跳转
     
    重定向的简化方式:

    response.sendRedirect("https://www.cnblogs.com/noteless/");
     
    如果是在同一台服务器上也可以用相对路径  
    response.sendRedirect("/servlet/ServletB");
     
    效果同上
     
    重定向注意点:
     
            重定向是两次请求;
            重定向的URL可以是其他应用,不局限于当前应用;
            重定向的响应头为302,并且必须要有Location响应头;
            重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常;
  • 相关阅读:
    POJ 1141 括号匹配 DP
    881. Boats to Save People
    870. Advantage Shuffle
    874. Walking Robot Simulation
    文件操作
    861. Score After Flipping Matrix
    860. Lemonade Change
    842. Split Array into Fibonacci Sequence
    765. Couples Holding Hands
    763. Partition Labels
  • 原文地址:https://www.cnblogs.com/xiang--liu/p/11505721.html
Copyright © 2011-2022 走看看