Использование Printwriter в ответе сервлета - PullRequest
5 голосов
/ 25 октября 2011

В этой ссылке указано: обрабатывает запрос пользователя на генерацию HTML-кода для отчета и записывает HTML-код непосредственно в объект ответа.Теперь в моем коде у меня есть:

PrintWriter out = response.getWriter();
crystalReportViewer.processHttpRequest(request, response, context,null);

Если я правильно понимаю, processHttpRequest сам будет делать что-то вроде response.getWriter().print(.....).

Так что код создает 2 экземпляра PrintWriter

1 Ответ

6 голосов
/ 25 октября 2011

Объект ответа каждый раз будет возвращать одну и ту же запись.Вы можете использовать эти записывающие устройства взаимозаменяемо:

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.

НадеюсьНе знаю, указано ли это как таковое в спецификации, Javadoc только говорит:

Либо этот метод, либо getOutputStream () может быть вызван для записи тела, но не оба.

При этом ваш код небезопасен по двум причинам:

  • crystalReportViewer может вызвать response.getOutputStream(), что нарушает указанный выше контракт

  • , если вы сначала напечатаете что-то, а затем передадите response на crystalReportViewer, то есть ваш выход сломает вывод crystalReportViewer, так как к нему будет добавлен символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...