对于你所有“重复”的狂热分子,SO上有一个类似的问题here。不同的是,我画了一个生动的例子,我无法理解输出。
JspWriter和PrintWriter的文档说有两点不同: 1. JspWriter可以抛出异常,PrintWriter不应该这样做。 2。 JspWriter在场景后面使用PrintWriter,但由于默认情况下JSP页面是缓冲的,因此在the buffer is flushed
之前不会创建PrintWriter - 无论JSP页面上下文中的含义是什么。我不确定我是否理解了最后一部分。考虑一下这个JSP页面:
<%@page import="java.io.PrintWriter"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JspWriter versus PrintWriter</title>
</head>
<body>
<p>I should be row one.</p>
<%
out.println("<p>JspWriter said: I should be the second row.</p>");
PrintWriter pw = response.getWriter();
pw.println("<p>PrintWriter said: I should be the third row.</p>");
%>
<p>I should be the fourth row.</p>
</body>
</html>
它产生以下输出:
PrintWriter said: I should be the third row.
I should be row one.
JspWriter said: I should be the second row.
I should be the fourth row.
正如您所看到的,JspWriter将我的字符串输出到浏览器是我期望的。但是在将所有其他内容发送到浏览器之前,PrintWriter会输出他的字符串。如果我们检查发送到浏览器的源代码,则在DOCTYPE声明之前,PrintWriter的字符串将作为第一行发送。那么在上面的例子中,到底发生了什么?
答案 0 :(得分:16)
解释在你自己的问题中:
JspWriter在场景后面使用PrintWriter,但默认情况下是这样 JSP页面被缓冲,PrintWriter不会被创建,直到 刷新缓冲区
这意味着写入JspWriter的内容是缓冲的,一旦刷新了这个缓冲区(因为缓冲区已满,或者因为JSP已经到了执行结束),内容就会写入响应&# 39; s PrintWriter。
因此,您的示例流程如下:
答案 1 :(得分:1)
JSP应该使用“out”隐式对象表示的JspWriter将输出发送回客户端。 JspWriter是PrintWriter的缓冲版本。有关详细信息,请参阅JspWriter API。 JspWriter与PrintWriter的区别在于抛出java.io.IOException,而PrintWriter则没有。