对于那些“重复”狂热者,SO上有一个类似的问题 在这里。不同之处在于我提供了一个生动的例子,以便更好地理解输出结果。
JspWriter 和 PrintWriter 的文档说明了它们两者之间的区别:1. JspWriter 可以抛出异常,而 PrintWriter 不会。 2. JspWriter 在幕后使用 PrintWriter,但由于默认情况下 JSP 页面是缓冲的,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在所有其他内容发送到浏览器之前就已经发送了他的字符串。如果我们检查发送到浏览器的源代码,PrintWriter的字符串将作为第一行发送,而不是DOCTYPE声明之前。因此,在上面的示例中,究竟会发生什么?