request、response对象

 

request

request概述:
request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据

response

response概述:
response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法。response对象是用来对客户端进行响应的,这说明在service()方法中使用response对象可以完成对客户端的响应工作

HttpServletResponse的应用

调用getOutputStream()方法向浏览器输出数据
调用getOutputStream()方法向浏览器输出数据,getOutputStream()方法可以使用print()也可以使用write(),它们有什么区别呢?

使用servletOutputStream.print()

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletOutputStream流对象
        ServletOutputStream servletOutputStream = resp.getOutputStream();
        //输出到浏览器
        servletOutputStream.print("Hello,World");

    }
}

可以输出

试着输出中文,却出现异常了

public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletOutputStream流对象
        ServletOutputStream servletOutputStream = resp.getOutputStream();
        //输出到浏览器
        servletOutputStream.print("你好,世界");
    }
}

异常信息如下:

<h1>HTTP Status 500 - Not an ISO 8859-1 character: 你</h1>

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

 response.getOutputStream().write("Hello,World".getBytes());

没有问题,再测试输出中文

 resp.getOutputStream().write("你好,世界".getBytes());

也没有问题

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

但是,程序要实现通用性,应该使用的是UTF-8编码,我们在字符串转换成字节数组时指定UTF-8编码,看看会怎么样。

resp.getOutputStream().write("你好,世界".getBytes("UTF-8"));

发现也是乱码
为什么它变成了乱码呢?
原因是这样的:我在向服务器输出的中文是UTF-8编码的,而浏览器采用的是GBK,GBK显示UTF-8的中文数据?没告诉浏览器你要显示UTF-8编码时,你要输出UTF-8不乱码才怪。既然这这样.
1、我可以修改代码设置输出编码是GBK

resp.getOutputStream().write("你好,世界".getBytes("GBK"));

2、也可以去修改浏览器的编码,同样可以正常显示中文。

乱码问题又解决了。可是,很多时候我们都是使用UTF-8的编码格式,使用UTF-8程序时都要去网页上改编码格式吗?这样明显不可能的。

既然HTTP响应有对浏览器说明回送数据是什么类型的消息头,那么HttpServletResponse对象就应该有相对应的方法告诉浏览器回送的数据编码格式是什么。浏览器在显示数据时,自动把页面的编码格式置换成UTF-8,乱码问题也解决了。

resp.setHeader("Content-Type","text/html;charset=UTF-8");
resp.getOutputStream().write("你好,世界".getBytes("UTF-8"));

Servlet有那么多方法解决乱码问题,是不是有一种是最简便的呢?没错!下面这个方法是最简便的,它不仅设置浏览器用UTF-8显示数据,内部还把中文转码的码表设置成UTF-8了,也就是说,response.setContentType("text/html;charset=UTF-8");把response.setCharacterEncoding("UTF-8")的事情也干了!

使用getWriter()显示中文数据,设置resp.setContentType("text/html;charset=UTF-8");就可以了。

            resp.setContentType("text/html;charset=UTF-8");
            //获取printWriter对象
            PrintWriter printWriter = resp.getWriter();
            printWriter.write("看完记得点个赞吧");

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值