• javaweb学习总结二十五(response对象的用法一)


    一:Reponse对象的概念

    当客户端发送http请求时,服务器端会对每一次请求,创建request对象和response对象。

    response对象包括三个部分:响应头、响应状态码以及响应体

    二:response对象案例分析

    1:向客户端输出中文数据

     1 package com.hlcui.servlet;
     2 
     3 import java.io.IOException;
     4 import java.io.OutputStream;
     5 import java.io.PrintWriter;
     6 
     7 import javax.servlet.ServletException;
     8 import javax.servlet.http.HttpServlet;
     9 import javax.servlet.http.HttpServletRequest;
    10 import javax.servlet.http.HttpServletResponse;
    11 
    12 public class ServletDemo6 extends HttpServlet {
    13 
    14     public void doGet(HttpServletRequest request, HttpServletResponse response)
    15             throws ServletException, IOException {
    16         
    17         String data = "好好学习!";
    18         //获取向客户端写数据的输出流
    19         OutputStream out = response.getOutputStream();
    20         out.write(data.getBytes());
    21     }
    22 
    23     public void doPost(HttpServletRequest request, HttpServletResponse response)
    24             throws ServletException, IOException {
    25         doGet(request,response);
    26     }
    27 
    28 }

    浏览器打印:

    结果正确!

    这里面要注意,因为我在服务器端对数据进行编码时,没有指定使用哪种字符集,所以默认是使用gb2312,

    而浏览器端解析时也是gb2312,所以正确显示,如果我指定编码字符为UTF-8,结果如下:

    使用UTF-8对数据进行编码:

    1 out.write(data.getBytes("UTF-8"));

    打印结果为乱码:

    因为我服务器端指定编码为UTF-8,而浏览器还是使用默认的解码方式进行解码,导致乱码。

    解决方式:

    可以通过设置浏览器的查看方式(使用UTF-8解析服务器发送过来的数据),但是不是根本办法,最好的办法是在

    服务器端告诉浏览器以何种方式进行解码。修改如下:

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

    结果是正确的!

    可以使用html标签中meta进行模拟服务器response响应头:

    1 public void doGet(HttpServletRequest request, HttpServletResponse response)
    2             throws ServletException, IOException {
    3         String data = "好好学习!";
    4         //获取向客户端写数据的输出流
    5         OutputStream out = response.getOutputStream();
    6         out.write("<meta http-equiv='content-type' content='text/html;charset=utf-8'>".getBytes());
    7         out.write(data.getBytes("UTF-8"));
    8     }

    结果依然是正确的!

    这里我们要了解服务端使用字符集编码以及浏览器解码的机制:

    1:服务器端对数据进行编码,编码时使用字符集(gb2312或者UTF-8),没有指定默认为gb2312

    2:浏览器解析response数据时,默认gb2312,它会拿着编码数据导字符集中取查询

    如果我们想在浏览器输出99,那么服务端首先端99进行编码,在浏览器端,会拿着99的编码到

    字符集中查询编码对应的内容。

    1 out.write("99".getBytes("UTF-8"));

    对99这个字符串进行UTF-8的编码。

    printWriter对象与OutputStream对象

    如果想浏览器写图片、视频以及音频文件等二进制文件时,必须使用字节流outputStream。

    如果向浏览器写字符串时,可以使用printwriter对象,下面使用printWriter向浏览器写中文:

    1 public void doGet(HttpServletRequest request, HttpServletResponse response)
    2             throws ServletException, IOException {
    3         String data = "好好学习!";
    4         //获取向客户端写数据的输出流
    5         PrintWriter out = response.getWriter();
    6         out.write(data);
    7     }

    输出结果:

    出现乱码,因为response向对数据进行编码时使用的ISO8859-1,而浏览器解析使用的gb2312,所以查询不到,报????

    解决方法:

     1 public void doGet(HttpServletRequest request, HttpServletResponse response)
     2             throws ServletException, IOException {
     3         //设置response对数据的编码方式
     4         response.setCharacterEncoding("UTF-8");
     5         //告诉浏览器解码方式
     6         response.setHeader("content-type", "text/html;charset=utf-8");
     7         String data = "好好学习!";
     8         //获取向客户端写数据的输出流
     9         PrintWriter out = response.getWriter();
    10         out.write(data);
    11     }

    输出正确结果:

    其实还可以使用response.setContentType("text/html;charset=utf-8");

    这是servlet封装好的API,相当于下面两句的内容

    //设置response对数据的编码方式
    response.setCharacterEncoding("UTF-8");
    //告诉浏览器解码方式
    response.setHeader("content-type", "text/html;charset=utf-8");

  • 相关阅读:
    localStorage溢出问题
    面试题梳理
    灵活的楼梯导航条代码
    日期初始化
    css 控制横向布局,超出隐藏,滚动
    自定义滚动条样式
    jquery源码之JQ对象
    jqeury源码之变量解析
    jquery源码之通篇概要
    工作站流处理
  • 原文地址:https://www.cnblogs.com/warrior4236/p/6021393.html
Copyright © 2020-2023  润新知