jsp页面out.print()和后台response.getWriter().print()的区别

【1】二者常见区别

① 这两个对象的类型是完全不同的

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

② 获取方式不同

JspWriter是JSP的内置对象,直接使用即可,对象名out是保留字,也只能通过out来调用其相关方法。此外还可以通过内置对象pageContext.getOut();获得。PrintWriter则是在用的时候需要通过内置对象response.getWriter()获得。

③ JspWriter的print()方法会抛出IOException而PrintWriter则不会。

④ JspWriter和PrintWriter都继承自Java.io.Writer,但JspWriter是抽象类,而PrintWriter不是抽象类。

JspWriter类继承示意图如下:

public abstract class JspWriter extends Writer {
    public static final int NO_BUFFER = 0;
    public static final int DEFAULT_BUFFER = -1;
    public static final int UNBOUNDED_BUFFER = -2;
    protected int bufferSize;
    protected boolean autoFlush;

    protected JspWriter(int bufferSize, boolean autoFlush) {
        this.bufferSize = bufferSize;
        this.autoFlush = autoFlush;
    }
    //...
 }

在这里插入图片描述
PrintWriter继承示意图如下:
在这里插入图片描述

【2】二者执行情况

最最主要的区别是:如果在同一jsp或Servlet文件中同时使用了JspWriter对象和PrintWriter对象,在调用print或者println方法后的执行情况不同!

有如下的jsp文件:
在这里插入图片描述
运行结果如图:
在这里插入图片描述
网页源代码如图:
在这里插入图片描述

通过两张图可以看出:PrintWriter对象的输出已经脱离了代码,而JspWriter对 象的输出仍然是在内输出 。


解释如下:

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

白话一点:火车票的两种售票途径,JspWriter对象和PrintWriter对象都可以输出response缓冲区的数据,只是JspWriter对象是个代售点,最终还是得依赖PrintWriter对象。

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

out内置对象调用PrintWriter对象的print系列方法输出缓冲区中内容的条件:

  • 设置page指令的buffer属性关闭了out对象的缓存功能。
  • 写入到out对象中的内容充满了out对象的缓冲区。
  • 整个JSP页面结束。

如果想让PrintWriter对象的输出回到内,只需让内置对象out刷新缓冲区即可(这样即会立即刷新缓冲区),即修改jsp代码如下:
在这里插入图片描述

运行结果如图:
在这里插入图片描述
网页源代码如图:
在这里插入图片描述

【3】out.print()、out.write()与out.println()

① out.print()和out.write()

print()和println()是JspWriter类中定义的方法,write()则是Writer类中定义的。

print()和println()方法可将各种类型的数据转换成字符串的形式输出,而write()方法只能输出字符、字符数组和字符串等与字符相关的数据。

如果字符串对象的值为null,print()和println()方法将输出内容为“null”的字符串,而write()方法则是抛出NullPointerException异常。

② out.print()和out.println()

println()虽然看似是换行,但转成网页之后,这种换行被认为是空格,所以输出的仍然是一行,用空格分隔,但右键点击页面查看源代码时,能看出换行起作用了。

所以在页面上需要换行的话,需要用<br/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值