zoukankan      html  css  js  c++  java
  • 9.17JavaWeb之HttpServletResponse

    9.17JavaWeb之HttpServletResponse

    什么是HttpServletResponse?

    概念:

    • Servlet API 中,定义的一个 HttpServletResponse 接口,它继承自 ServletResponse 接口

    作用:

    • 封装Http响应消息--->Response对象

    • 响应信息封装到response对象中,容器解析后返回给客户端

    Http响应组成

    • 响应行

    • 响应头

    • 消息体

    HttpServletResponse 接口中定义了向客户端发送响应状态码、响应头、响应体的方法

    响应行相关方法

    响应行要素:

    • 需要在响应消息中设置状态码

    返回值类型方法描述
    void setStatus(int status) 用于设置 HTTP 响应消息的状态码,并生成响应状态行。
    void sendError(int sc) 用于发送表示错误信息的状态码。

    响应头相关方法

    返回值类型方法描述
    void addHeader(String name,String value) 用于增加响应头字段,其中,参数 name 用于指定响应头字段的名称,参数 value 用于指定响应头字段的值。
    void setHeader (String name,String value) 用于设置响应头字段,其中,参数 name 用于指定响应头字段的名称,参数 value 用于指定响应头字段的值。
    void addIntHeader(String name,int value) 用于增加值为 int 类型的响应头字段,其中,参数 name 用于指定响应头字段的名称,参数 value 用于指定响应头字段的值,类型为 int。
    void setIntHeader(String name, int value) 用于设置值为 int 类型的响应头字段,其中,参数 name 用于指定响应头字段的名称,参数 value 用于指定响应头字段的值,类型为 int。
    void setContentType(String type) 用于设置 Servlet 输出内容的 MIME 类型以及编码格式。
    void setCharacterEncoding(String charset) 用于设置输出内容使用的字符编码。

    响应体相关方法

    ServletResponse 遵循以 I/O 流传递大量数据的设计理念,,定义了两个与输出流相关的方法。

    返回值类型方法描述
    ServletOutputStream getOutputStream() 用于获取字节输出流对象。
    PrintWriter getWriter() 用于获取字符输出流对象。

    注意:

    getOutputStream() 和 getWriter() 方法互相排斥,不可同时使用,否则会发生 IllegalStateException 异常。

    示例代码:

    需求:

    • 创建一个OutServlet类使用上诉方法

    package com.example.HttpServletRequestDemo;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.nio.charset.StandardCharsets;

    /**
    * 为了使用Response接口当中的方法而写的测试类
    * @since JDK 1.8
    * @date 2021/09/17
    * @author Lucifer
    */
    public class OutServlet extends HttpServlet {
       //设置UID
       private static final long serialVersionUID = 1L;

       //Get
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
           //调用处理结果方法
           runNo1(resp);
      }

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

       //定义一个处理响应的方法--->使用字符流向页面输出
       private void runNo1(HttpServletResponse resp) throws IOException {
           resp.getWriter().write(
                   "WelCome To My Servlet!"
          );
      }

       //定义一个使用字节流向页面输出的方法(这个方法就可以输出图片到前端)
       private void runNo2(HttpServletResponse resp) throws IOException {
           //设置响应字符集
           resp.setContentType("text/html;charset=UTF-8");
           //获取字节输出流
           OutputStream os = resp.getOutputStream();
           //将要输出流存入字节数组
           byte[] str = "JunkingBoy".getBytes(StandardCharsets.UTF_8);
           //输出
           os.write(str);
      }
    }
    使用字节流输出中文乱码

    重点:

    中文转成字节数组时与浏览器打开时采用的字符集要一致。

    解决方案:

    中文转成字节数组时和浏览器默认采用的字符集保持一致

    response.setHeader("Content-Type", "text/html;charset=UTF-8");
    // 获取字节输出流
    OutputStream os = response.getOutputStream();
    byte[] str = "编程帮 www.biancheng.net".getBytes("UTF-8");
    // 输出中文
    os.write(str)
    使用字符流输出中文乱码

    成因:

    通过字符流输出的内容是存放在 response 缓冲区的,response 缓冲区的默认字符集是 ISO-8859-1,该字符集不支持中文。

    解决方案:

    将 response 缓冲区和浏览器采用的字符集保持一致即可

    // 设置response缓冲区的编码
    response.setCharacterEncoding("UTF-8");
    // 设置浏览器打开文件所采用的编码
    response.setHeader("Content-Type", "text/html;charset=UTF-8");
    // 输出中文
    response.getWriter().write("编程帮 www.biancheng.net");
    response.setContentType("text/html;charset=UTF-8");
    response.getWriter().write("编程帮 www.biancheng.net");

     

    It's a lonely road!!!
  • 相关阅读:
    宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)
    朱辉(茶水): Linux Kernel iowait 时间的代码原理
    宋宝华:Linux设备驱动框架里的设计模式之——模板方法(Template Method)
    宋宝华:论程序员的时代焦虑与焦虑的缓解
    邵国际: C 语言对象化设计实例 —— 命令解析器
    让天堂的归天堂,让尘土的归尘土——谈Linux的总线、设备、驱动模型
    宋宝华:关于Ftrace的一个完整案例
    php采集页面指定标签里面的内容
    js调用video的播放时长
    php解析url并得到url中的参数
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15308489.html
Copyright © 2011-2022 走看看