Diferença entre JspWriter e PrintWriter no Java EE?

Para todos os "fanáticos" duplicados, há uma pergunta semelhante sobre o direito de SOAqui. A diferença é que eu pintei um exemplo vívido que eu não consigo entender a saída de.

A documentação paraJspWriter ePrintWriter diz que há duas diferenças:1 JspWriter pode lançar exceções, PrintWriter não deve fazer isso.2 O JspWriter usa um PrintWriter atrás da cena, mas como por padrão as páginas JSP são armazenadas em buffer, o PrintWriter não será criado atéthe buffer is flushed - o que quer que isso signifique no contexto de uma página JSP. Não tenho certeza se entendi essa última parte. Considere esta página 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>

Produz a seguinte saída:

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.

Como você pode ver, o JspWriter envia sua string para o navegador onde eu esperava. Mas o PrintWriter envia sua string antes que todo o restante seja enviado para o navegador. Se examinarmos o código-fonte enviado ao navegador, a string do PrintWriter é enviada como a primeira linha, antes da declaração DOCTYPE. Então, no exemplo acima, exatamente o que acontece?

questionAnswers(2)

yourAnswerToTheQuestion