Подтвердить что ты не робот

Разница между JspWriter и PrintWriter в Java EE?

Для всех вас, "дублирующих" фанатиков, есть аналогичный вопрос о SO right здесь. Разница в том, что я нарисовал яркий пример того, что я не могу понять вывод.

Документация для 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. Итак, в приведенном выше примере, что именно происходит?

4b9b3361

Ответ 1

Объяснение в вашем собственном вопросе:

JspWriter использует PrintWriter за сценой, но поскольку по умолчанию Страницы JSP буферизуются, PrintWriter не будет создан до тех пор, пока буфер сбрасывается

Это означает, что то, что записано в JspWriter, буферизовано, и как только этот буфер будет сброшен (либо из-за того, что буфер заполнен, либо из-за того, что JSP завершил его выполнение), содержимое записывается в ответ PrintWriter.

Итак, поток вашего примера следующий:

  • статический код HTML до тех пор, пока скриптлет не будет записан в буфер в памяти
  • out.println(...): записан в буфер памяти
  • pw.println(...): записано в ответ
  • статический HTML-код до конца JSP: записан в буфер в памяти
  • флеш буфера в памяти: все, что он содержит, записывается в ответ

Ответ 2

JSP должны использовать JspWriter, обозначаемый "вне" неявным объектом для отправки вывода обратно клиенту. JspWriter - это буферизованная версия PrintWriter. Для получения более подробной информации обратитесь к JspWriter API. JspWriter также отличается от PrintWriter, бросая java.io.IOException, которого нет в PrintWriter.