狂信者を「複製」するすべての人にとって、SO right here )に同様の質問があります。違いは、出力を理解できない鮮やかな例を描くことです。の。
JspWriter と PrintWriter のドキュメントには、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宣言の前の最初の行として送信されます。したがって、上記の例では、正確に何が起こりますか?
説明はあなた自身の質問にあります:
JspWriterはバックグラウンドでPrintWriterを使用しますが、デフォルトではJSPページがバッファリングされるため、バッファがフラッシュされるまでPrintWriterは作成されません。
これは、JspWriterに書き込まれる内容がバッファリングされ、このバッファがフラッシュされると(バッファがいっぱいであるか、JSPが実行の終わりに達したため)、内容が応答のPrintWriterに書き込まれることを意味します。
したがって、例のフローは次のようになります。
JSPは、出力をクライアントに送り返すために、「out」暗黙オブジェクトで示されるJspWriterを使用する必要があります。 JspWriterは、PrintWriterのバッファバージョンです。詳細については、JspWriterAPIを参照してください。 JspWriterは、PrintWriterがスローしないJava.io.IOExceptionをスローするという点でも、PrintWriterとは異なります。