JSP中out.println()与response.getWriter().println()输出的区别

首先说明两者的主要区别(加*为重点)
*1.两者的类不同,out的类是JspWriter,response.getWriter()的类是PrintWriter
*2.out是JSP的内置对象,直接就可以调用里面的方法,而PrintWriter调用之前需要response.getWriter()获取对象。
3. JspWriter的print()方法会抛出IOException,而PrintWriter则不会 。
4. JspWriterPrintWriter都继承自Java.io.Writer,但前者是抽象类**,而后者却不是。
**5.最主要的区别:
在同一个jsp或servlet文件中同时使用到了JspWriter对象和PrintWriter对象,在调用print或println方法后的执行情况不同
演示如下

<%@ page language="java" import="java.io.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    response.setContentType("text/html;charset=utf-8");//设置响应的内容类型以及编码方式
    out.print("out输出");
    out.println("<br>");//输出回车
    response.getWriter().println("PrintWriter输出");
%>

结果为
这里写图片描述
显然out的输出方式被“插队”了,这是为什么呢?

这是因为,out对象是JspWriter类的一个实例,这个类的幕后其实还是PrintWriter类,
只是JspWriter具有缓存,只有它的缓存刷新了后才会创建PrintWriter类,
并将JspWriter对象中的内容写入到PrintWriter类对象中。

自己的理解是这相当于JspWriter只是个代购,在收到钱之后,他不是马上就把货给你,而是满足他的条件后,再去PrintWriter的店取货然后把货给你。

只有满足以下任一条件时,out对象才去调用getWriter()方法,通过PrintWriter对象将out对象缓冲区中的内容写到Response响应对象中:
1. 设置page指令将“buffer”属性为“none” 。
2. 写入到out对象中的内容充满了out对象的缓冲区。
3. 整个JSP页面执行完毕。

如果想让out的输出直接输出出来,刷新out的缓冲区即可,即修改jsp代码为:

<%@ page language="java" import="java.io.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
    response.setContentType("text/html;charset=utf-8");//设置响应的内容类型以及编码方式
    out.print("out输出");
    out.println("<br>");//输出回车
    out.flush();//输出缓冲区
    response.getWriter().println("PrintWriter输出");
%>

现在可以得到out输出在前面的结果了
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_38958597/article/details/82693273