Java 在servlet响应中使用Printwriter

Java 在servlet响应中使用Printwriter,java,servlets,response,crystal-reports-2008,printwriter,Java,Servlets,Response,Crystal Reports 2008,Printwriter,在这里,它表示:处理用户生成报告HTML的请求,并将HTML直接写入响应对象。 现在在我的代码中,我有: PrintWriter out = response.getWriter(); crystalReportViewer.processHttpRequest(request, response, context,null); 如果我理解正确,processHttpRequest本身将执行类似于response.getWriter().print(…)。 因此,代码是否创建了两个PrintW

在这里,它表示:处理用户生成报告HTML的请求,并将HTML直接写入响应对象。 现在在我的代码中,我有:

PrintWriter out = response.getWriter();
crystalReportViewer.processHttpRequest(request, response, context,null);
如果我理解正确,
processHttpRequest
本身将执行类似于
response.getWriter().print(…)。


因此,代码是否创建了两个
PrintWriter
实例?

响应对象每次都将返回同一个writer。您可以互换使用这些编写器:

final PrintWriter writerA = response.getWriter();
final PrintWriter writerB = response.getWriter();
writerA.println("A1");
writerB.println("B1");
writerA.println("A2");
writerB.println("B2");
输出与预期一致,因为
writerA
writerB
实际上指向的是
PrintWriter
的完全相同的实例

我不知道规范中是否有这样的规定,唯一的说明是:

可以调用此方法或getOutputStream()来编写主体,而不是同时调用两者

也就是说,您的代码不安全有两个原因:

  • crystalReportViewer
    可能会调用
    response.getOutputStream()
    ,这会破坏上面引用的契约

  • 如果您先打印一些内容,然后将
    响应
    传递给
    crystalReportViewer
    很可能您的输出会破坏
    crystalReportViewer
    输出,因为它将被预先设置