web-dev-qa-db-ja.com

Java EE?のJspWriterとPrintWriterの違い

狂信者を「複製」するすべての人にとって、SO right here )に同様の質問があります。違いは、出力を理解できない鮮やかな例を描くことです。の。

JspWriterPrintWriter のドキュメントには、2つの違いがあると記載されています: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宣言の前の最初の行として送信されます。したがって、上記の例では、正確に何が起こりますか?

16

説明はあなた自身の質問にあります:

JspWriterはバックグラウンドでPrintWriterを使用しますが、デフォルトではJSPページがバッファリングされるため、バッファがフラッシュされるまでPrintWriterは作成されません。

これは、JspWriterに書き込まれる内容がバッファリングされ、このバッファがフラッシュされると(バッファがいっぱいであるか、JSPが実行の終わりに達したため)、内容が応答のPrintWriterに書き込まれることを意味します。

したがって、例のフローは次のようになります。

  • スクリプトレットまでの静的HTMLコード:メモリ内バッファに書き込まれます
  • out.println(...):メモリ内バッファに書き込まれます
  • pw.println(...):応答に書き込まれます
  • jSPの終わりまでの静的HTMLコード:メモリ内バッファに書き込まれます
  • インメモリバッファのフラッシュ:含まれているすべてが応答に書き込まれます
16
JB Nizet

JSPは、出力をクライアントに送り返すために、「out」暗黙オブジェクトで示されるJspWriterを使用する必要があります。 JspWriterは、PrintWriterのバッファバージョンです。詳細については、JspWriterAPIを参照してください。 JspWriterは、PrintWriterがスローしないJava.io.IOExceptionをスローするという点でも、PrintWriterとは異なります。

1