【问题标题】:Difference between JspWriter and PrintWriter in Java EE?Java EE 中 JspWriter 和 PrintWriter 的区别?
【发布时间】:2012-10-23 11:20:11
【问题描述】:

对于所有“重复”的狂热分子,SO right here 上有一个类似的问题。不同的是,我画了一个生动的例子,我无法理解它的输出。

JspWriterPrintWriter 的文档说有两个区别: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 在所有其他内容发送到浏览器之前输出他的字符串。如果我们检查发送到浏览器的源代码,PrintWriter 的字符串作为第一行发送,在 DOCTYPE 声明之前。那么在上面的例子中,究竟发生了什么?

【问题讨论】:

    标签: jsp jakarta-ee buffer printwriter output


    【解决方案1】:

    解释在你自己的问题中:

    JspWriter 在后台使用 PrintWriter,但默认情况下 JSP 页面被缓冲,PrintWriter 将不会被创建,直到 缓冲区被刷新

    这意味着写入 JspWriter 的内容被缓冲,一旦这个缓冲区被刷新(或者因为缓冲区已满,或者因为 JSP 已经到了执行的末尾),内容就会被写入响应的 PrintWriter .

    所以您的示例流程如下:

    • scriptlet 之前的静态 HTML 代码:写入内存缓冲区
    • out.println(...):写入内存缓冲区
    • pw.println(...):写入响应
    • JSP 结束前的静态 HTML 代码:写入内存缓冲区
    • 内存缓冲区的刷新:它包含的所有内容都写入响应

    【讨论】:

    • 嗯,你去吧!谢谢朋友,非常感谢。
    • 很棒的解释
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      • 2013-01-05
      • 2012-12-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      相关资源
      最近更新 更多