17

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

JspWriterPrintWriterのドキュメントには、2つの違いがあると記載されています。1。JspWriterは例外をスローできますが、PrintWriterは例外をスローしないでください。2. JspWriterはバックグラウンドでPrintWriterを使用しますが、デフォルトではJSPページがバッファリングされるためthe buffer is flushed、JSPページのコンテキストで意味するものが何であれ、PrintWriterは作成されません。この最後の部分を理解したかどうかはわかりません。この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宣言の前の最初の行として送信されます。したがって、上記の例では、正確に何が起こりますか?

4

2 に答える 2

17

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

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

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

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

  • スクリプトレットまでの静的HTMLコード:メモリ内バッファに書き込まれます
  • out.println(...):メモリ内バッファに書き込まれます
  • pw.println(...):応答に書き込まれます
  • JSPの最後までの静的HTMLコード:メモリ内バッファに書き込まれます
  • インメモリバッファのフラッシュ:そこに含まれるすべてが応答に書き込まれます
于 2012-11-02T19:03:00.053 に答える
0

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

于 2013-10-19T11:58:04.887 に答える