JSP内置对象out调用print系列方法和内置对象response.getWrite()的区别

JSP内置对象out调用print系列方法和内置对象response.getWrite()的区别


说明:此文仅做学习笔记整理。


一、区别

1. 对象类型不同

内置对象out的类型是JspWriter;response.getWrite()返回的类型是PrintWriter。

2. 获取方式不同

JspWriter是jsp的内置对象,直接使用即可,对象名out是保留字,可通过“out.方法名”掉用相关方法。
此外还可以通过内置对象pageContext.getOut()获得。

PrintWriter则是通过内置对象response.getWriter()获得。

3. 底层实现不同

JspWriter相当于一个带缓冲功能的PrintWriter,它对PrintWriter有依赖。初始化一个JspWriter对象的时候要关联
ServletResponse对象的一个PrintWriter对象,最终JspWriter对象的输出任务还是通过与之关联的PrintWriter
对象完成的。

JspWriter对象不是直接将数据输出到页面,而是先将数据刷新到response的缓冲区,然后等待out内置对象满足一定的条
件后才会调用PrintWriter对象的print系列方法把out内置对象的缓冲区中的内容输出到浏览器。

注:如果想内置对象out调用PrintWriter对象的print系列方法正常输出(按jsp中书写顺序)缓冲区中内容,只需刷流即可,如out.flush()等等。


二、经典题

JSP内置对象out调用print系列方法和内置对象response.getWrite()的区别_第1张图片

分析:
第一次for循环,out对象将” ?”存入自己的缓冲区,等待时机将自己的缓冲区数据存入PrintWriter对象的缓冲区;而当进行response.getWriter()获取PrintWriter对象时,阻塞(截断)了out对象将自己的缓冲区数据存入PrintWriter对象缓冲区的执行;当PrintWriter对象输出两次” * “后,在某时刻,out对象准备将自己的缓冲区数据存入PrintWriter对象缓冲区时,此时w.close()关闭了PrintWriter对象(即也就没有了PrintWriter对象缓冲区),out对象的数据也就刷不进来了,页面也就不会输出” ?”了。
第二次for循环同上。

你可能感兴趣的:(JSP/Servlet)