Java EE中JspWriter和PrintWriter的区别是什么?

17

对于那些“重复”狂热者,SO上有一个类似的问题 在这里。不同之处在于我提供了一个生动的例子,以便更好地理解输出结果。

JspWriterPrintWriter 的文档说明了它们两者之间的区别: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声明之前。因此,在上面的示例中,究竟会发生什么?

2个回答

17

解释在您提出的问题中:

JspWriter在幕后使用PrintWriter,但由于默认情况下JSP页面是缓冲的,因此直到刷新缓冲区时PrintWriter才会被创建

这意味着写入JspWriter的内容将被缓冲,一旦缓冲区被刷新(无论是缓冲区已满还是JSP已执行到结尾),内容就会被写入响应的PrintWriter。

因此,您的示例流程如下:

  • 静态HTML代码直到脚本:写入内存缓冲区
  • out.println(...): 写入内存缓冲区
  • pw.println(...): 写入响应
  • 静态HTML代码直到JSP结束:写入内存缓冲区
  • 刷新内存缓冲区:其中包含的所有内容都会写入响应

好的,这就是你需要的!谢谢伙计,非常感激。 - Martin Andersson
很棒的解释 - tin_tin

0
JSP应该使用由“out”隐式对象表示的JspWriter将输出发送回客户端。 JspWriter是PrintWriter的缓冲版本。有关详细信息,请参阅JspWriter API。 JspWriter还通过抛出java.io.IOException与PrintWriter不同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接