JSP/Servlet天泰学习笔记(一)对象

response、request对象

Tomcat收到客户端的http请求,会针对每一次请求,分别创建一个代表请求的request对象、和代表响应的response对象

既然request对象代表http请求,那么我们获取浏览器提交过来的数据,找request对象即可。response对象代表http响应,那么我们向浏览器输出数据,找response对象即可。

什么是HttpServletResponse对象?

http响应由状态行、实体内容、消息头、一个空行组成。HttpServletResponse对象就封装了http响应的信息。

1、HttpServletResponse的应用

调用getOutputStream()方法向浏览器输出数据,getOutputStream()方法可以使用print()也可以使用write(),它们有什么区别呢?我们试验一下。代码如下

  //获取到OutputStream流
  ServletOutputStream servletOutputStream = response.getOutputStream();
  //向浏览器输出数据
  servletOutputStream.print("aaaa");

成功输出,好像没什么毛病。
在这里插入图片描述
但是输入中文时报错了

为什么会出现异常呢?在io中学过,outputStream是输出二进制数据的,print()方法接收了一个字符串,print()方法要把中文改成二进制数据,Tomcat使用ISO 8859-1编码对其进行转换,“中国”根本对ISO 8859-1编码不支持。所以出现了异常

我们再看看write()方法,先向浏览器输出英文数据

 response.getOutputStream().write("aaa".getBytes());
 //没有问题
 response.getOutputStream().write("你好呀我是中国".getBytes());
 //中文也同时没有问题

为什么使用write()方法能够正常向浏览器输出中文呢?“你好呀我是中国”.getBytes()这句代码在转成byte[]数组的时候默认查的是gb2312编码,而"你好呀我是中国"支持gb2312编码,所以可以正常显示出来。

但是,程序要实现通用性,应该使用的是UTF-8编码,我们在字符串转换成字节数组时指定UTF-8编码。
这时,我们需要使用消息头

 //设置头信息,告诉浏览器我回送的数据编码是utf-8的
 response.setHeader("Content-Type", "text/html;charset=UTF-8");

 response.getOutputStream().write("你好呀我是中国".getBytes("UTF-8"));

浏览器在显示数据时,自动把页面的编码格式置换成UTF-8,乱码问题也解决了。
另外,除了使用HttpServletResponse对象设置消息头的方法,我可以使用html的标签模拟一个http消息头

 //获取到servletOutputStream对象
 ServletOutputStream servletOutputStream = response.getOutputStream();
 //使用meta标签模拟http消息头,告诉浏览器回送数据的编码和格式
 servletOutputStream.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
 servletOutputStream.write("我是中国".getBytes("UTF-8"));

乱码问题也可以解决

2、调用getWriter()方法向浏览器输出数据

对于getWriter()方法而言,是Writer的子类,那么只能向浏览器输出字符数据,不能输出二进制数据

使用getWriter()方法输出中文数据,代码如下:

    //获取到printWriter对象
    PrintWriter printWriter = response.getWriter();
    printWriter.write("看完博客点赞!");

喜闻可见的事又出现了,我又出现乱码了。

为什么出现乱码了呢?由于Tomcat是外国人的写,Tomcat默认的编码是ISO 8859-1,当我们输出中文数据的时候,Tomcat会依据ISO 8859-1码表给我们的数据编码,中文不支持这个码表呀,所以出现了乱码

既然如此,我设置一下编码不就好了吗,代码如下:

    //原本是ISO 8859-1的编码,我设置成UTF-8
    response.setCharacterEncoding("UTF-8");

    //获取到printWriter对象
    PrintWriter printWriter = response.getWriter();
    printWriter.write("看完博客点赞!");

为什么乱码问题还没有解决?因为浏览器使用GB2312显示UTF-8的数据,不乱码才怪呢

这个问题我们在上面已经是有两种方法解决了【使用标签模拟消息头、设置消息头】,Servlet还提供了一个方法给我们

    //设置浏览器用UTF-8编码显示数据
    response.setContentType("text/html;charset=UTF-8");

好的,我们再来访问一下

既然Servlet有那么多方法解决乱码问题,是不是有一种是最简便的呢?没错!下面这个方法是最简便的,它不仅设置浏览器用UTF-8显示数据,内部还把中文转码的码表设置成UTF-8了,也就是说,

response.setContentType(“text/html;charset=UTF-8”);

response.setCharacterEncoding(“UTF-8”)
的事情也干了!

使用getWriter()显示中文数据,只需要一个方法就搞掂了!

    //设置浏览器用UTF-8编码显示数据,
    response.setContentType("text/html;charset=UTF-8");

    //获取到printWriter对象
    PrintWriter printWriter = response.getWriter();
    printWriter.write("看完博客点赞!");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值