小编典典

Java EE中的JspWriter和PrintWriter之间的区别?

jsp

为了你的“重复”的狂热分子,对这样的权利类似的问题在这里。所不同的是,我描绘了一个我无法理解其输出的生动示例。

JspWriterPrintWriter的文档说有两个区别:
1. JspWriter可以引发异常,而PrintWriter不应这样做。 2.
JspWriter在幕后使用PrintWriter,但是由于默认情况下JSP页面被缓冲,因此PrintWriter直到the buffer is flushed-在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的字符串作为第一行发送。因此,在上面的示例中,究竟发生了什么?


阅读 297

收藏
2020-06-08

共1个答案

小编典典

解释是您自己的问题:

JspWriter在后台使用了PrintWriter,但是由于默认情况下JSP页面被缓冲,因此在刷新缓冲区之前,不会创建PrintWriter

这意味着写入JspWriter的内容被缓冲,并且一旦刷新了该缓冲区(因为缓冲区已满,或者因为JSP已经执行完毕),其内容就会写入响应的PrintWriter。

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

  • 静态HTML代码,直到scriptlet:写入内存缓冲区
  • out.println(…):写入内存缓冲区
  • pw.println(…):写入响应
  • 静态HTML代码,直到JSP结束:写入内存缓冲区
  • 刷新内存缓冲区:将其包含的所有内容写入响应
2020-06-08