的JspWriter和PrintWriter的Java EE中的区别?(Difference bet

2019-07-03 12:23发布

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

对于文档的JspWriter和PrintWriter的说,有两点不同: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输出一行字符串。 如果我们检查发送到浏览器的源代码,为PrintWriter的字符串被作为的第一行,该DOCTYPE声明之前。 所以在上面的例子中,究竟发生了什么?

Answer 1:

【解说】在你自己的问题:

的JspWriter使用幕后一个PrintWriter,但由于默认情况下,JSP页面缓冲时,PrintWriter的将不会被创建,直到缓冲区被刷新

这意味着什么写入的JspWriter缓冲,一旦该缓冲区被刷新(或因为缓冲区已满,或因为JSP已达到其执行结束),内容被写入到响应的PrintWriter的。

所以,你的例子的流程如下之一:

  • 静态的HTML代码,直到小脚本:写入到内存缓冲区
  • 通过out.println(......):写入到内存缓冲区
  • pw.println(...):写入响应
  • 静态的HTML代码,直到JSP的末尾:写入到内存中的缓冲
  • 在内存中的缓冲液冲洗:它包含所有被写入到响应


Answer 2:

JSP中应该使用用于发送输出返回给客户端的“出”隐式对象表示的的JspWriter。 一的JspWriter是PrintWriter的缓冲版本。 请参阅的JspWriter API的详细信息。 的JspWriter也不同于抛出java.io.IOException的一个PrintWriter,其中一个PrintWriter没有。



文章来源: Difference between JspWriter and PrintWriter in Java EE?