Servlet第三篇【request和response简介、response的常见应用】(一)

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

response、request对象


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

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


什么是HttpServletResponse对象?


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

HttpServletResponse的应用


调用getOutputStream()方法器输出数据


  • 调用getOutputStream()方法向浏览器输出数据,getOutputStream()方法可以使用print()也可以使用write(),它们有什么区别呢?我们试验一下。代码如下
//获取到OutputStream流
        ServletOutputStream servletOutputStream = response.getOutputStream();
        //向浏览器输出数据
        servletOutputStream.print("aaaa");
  • 成功输出,好像没什么毛病。

37.png

  • 我们试着输出中文试试
//获取到OutputStream流
        ServletOutputStream servletOutputStream = response.getOutputStream();
        //向浏览器输出数据
        servletOutputStream.print("中国!");
  • 出异常了!!!

38.jpg


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


response.getOutputStream().write("aaa".getBytes());
  • 没有问题

image.gif39.jpg

  • 再试试输出中文数据
response.getOutputStream().write("你好呀我是中国".getBytes());
  • 貌似也没有问题。

image.gif40.png

  • 为什么使用write()方法能够正常向浏览器输出中文呢?"你好呀我是中国".getBytes()这句代码在转成byte[]数组的时候默认查的是gb2312编码,而"你好呀我是中国"支持gb2312编码,所以可以正常显示出来。
  • 但是,程序要实现通用性,应该使用的是UTF-8编码,我们在字符串转换成字节数组时指定UTF-8编码,看看会怎么样。
response.getOutputStream().write("你好呀我是中国".getBytes("UTF-8"));
  • 好的,成功把它搞成乱码了!!!

40.png

  • 为什么它变成了乱码呢?原因是这样的:我在向服务器输出的中文是UTF-8编码的,而浏览器采用的是GBK,GBK想显示UTF-8的中文数据,不乱码才怪呢

41.jpg

  • 既然如此,我将浏览器的编码改成UTF-8试试。

42.jpg

  • 乱码问题又解决了。可是,每次编写UTF-8程序时都要去网页上改编码格式吗?这样明显不可能的
  • 既然HTTP响应有对浏览器说明回送数据是什么类型的消息头,那么HttpServletResponse对象就应该有相对应的方法告诉浏览器回送的数据编码格式是什么
  • 于是乎就去查找Servlet API,找到了设置消息头的方法


//设置头信息,告诉浏览器我回送的数据编码是utf-8的
        response.setHeader("Content-Type", "text/html;charset=UTF-8");
        response.getOutputStream().write("你好呀我是中国".getBytes("UTF-8"));
  • 浏览器在显示数据时,自动把页面的编码格式置换成UTF-8,乱码问题也解决了

image.gif43.jpg

  • 另外,除了使用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"));
  • 乱码问题也可以解决

image.gif44.jpg


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


  • 对于getWriter()方法而言,是Writer的子类,那么只能向浏览器输出字符数据,不能输出二进制数据
  • 使用getWriter()方法输出中文数据,代码如下:
//获取到printWriter对象
        PrintWriter printWriter = response.getWriter();
        printWriter.write("看完博客点赞!");
  • 喜闻可见的事又出现了,我又出现乱码了。

image.gif45.png

  • 为什么出现乱码了呢?由于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("看完博客点赞!");
  • 我再访问了一下,我的天!看起来更乱了!

image.gif46.png

  • 为什么乱码问题还没有解决?细心的朋友会发现,我只是在中文转换的时候把码表设置成UTF-8,但是浏览器未必是使用UTF-8码表来显示数据的呀
  • 好的,我们来看看浏览器的编码格式,果然,浏览器使用GB2312显示UTF-8的数据,不乱码才怪呢

477.jpg

  • 这个问题我们在上面已经是有两种方法解决了【使用标签模拟消息头、设置消息头】,Servlet还提供了一个方法给我们
//设置浏览器用UTF-8编码显示数据
        response.setContentType("text/html;charset=UTF-8");
  • 好的,我们再来访问一下

48.jpg

  • 既然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("看完博客点赞!");

49.png

目录
相关文章
|
5月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
107 10
|
5月前
|
缓存 负载均衡 安全
Servlet与JSP在Java Web应用中的性能调优策略
【6月更文挑战第23天】在Java Web中,Servlet和JSP调优至关重要,以应对高并发和复杂业务带来的性能挑战。优化包括Servlet复用、线程安全、数据库连接池,以及JSP的编译优化、使用JSTL、页面缓存和静态内容分离。全局优化涉及负载均衡、异步处理和缓存策略。通过这些实践,开发者能提升应用响应速度和吞吐量,确保高负载下的稳定运行。
78 7
|
5月前
|
前端开发 小程序 Java
深入解析Java Servlet与JSP:构建高效服务器端应用
【6月更文挑战第23天】Java Servlet和JSP是Web开发的关键技术,用于构建高效服务器端应用。Servlet处理HTTP请求,执行业务逻辑,而JSP专注于动态HTML生成。两者结合,借助MVC架构,实现逻辑与视图分离,提高代码可读性和性能。尽管有新框架出现,Servlet和JSP仍是许多项目的基础。
111 7
|
5月前
|
Java 应用服务中间件
Servlet简介&快速入门
Servlet简介&快速入门
|
6月前
|
JSON 网络协议 前端开发
简介Servlet2
简介Servlet
44 1
|
6月前
|
存储 Java 应用服务中间件
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(2)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
67 2
|
6月前
|
Web App开发 XML Java
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解(1)
Servlet执行流程&生命周期&方法介绍&体系结构、Request和Response的功能详解
111 2
|
6月前
|
Java 应用服务中间件 API
简介Servlet1
简介Servlet
36 0
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
33 3
|
3月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
32 1