Нужно ли нам записывать данные в исходный ответ даже после использования ResponseWrapper? - PullRequest
0 голосов
/ 16 февраля 2011

Я видел много примеров того, как и почему завернуть ответ. Насколько я понимаю, класс, расширяющий HttpServletResponseWrapper, предоставляет поток сервлету для записи данных поверх ответа (плюс некоторые дополнительные методы, которые мы можем использовать согласно нашей необходимости). Так что сервлет может записывать данные через настроенный поток ответов.

Кроме того, в пользовательском классе мы можем изменять содержимое потока, как; удаление пробела, преобразование регистра, сжатие и т. д. Но любая такая операция может быть выполнена после того, как сервлет завершит работу и закроет поток ответа. Таким образом, в основном пользовательский класс используется только для хранения данных ответа. И мы обязаны записывать данные в исходный поток ответов дальше, когда управление возвращается обратно в фильтр из сервлета.

Ссылочный код для моего понимания выше

CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse)response);
chain.doFilter(request, wrapper);
response.setContentLength(caw.toString().length());
out.write(caw.toString());
out.close(); 

Другие ссылки

http://jango.wordpress.com/2009/04/27/js-minify-filter-in-java/

http://onjava.com/pub/a/onjava/2003/11/19/filters.html?page=3

Теперь, пожалуйста, объясните мне код, предложенный balusc

HttpServletResponse httpres = (HttpServletResponse) response;
chain.doFilter(request, wrapResponse(httpres, createTrimWriter(httpres)));

Не требует ли запись данных и в поток ответов? Пожалуйста, скажите мне, что я пропускаю какую-то часть.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2011

В идеале ваша оболочка ответа выполняет какой-либо тип сервиса для контента, записываемого в выходной поток.В некоторых случаях вам может понадобиться также обернуть выходной поток.Это можно сделать, переопределив метод getOutputStream () в оболочке ответа (и, возможно, метод getWriter ()), чтобы он возвращал пользовательский выходной поток (или Writer).Когда содержимое записывается в пользовательский выходной поток (или Writer), вы выполняете одно из трех действий (обычно):

  1. (возможно, изменяете данные и) записываете его в исходный выходной поток.*
  2. буферизуйте его (частично или полностью), (возможно, измените данные и) запишите его в исходный поток вывода.
  3. полностью удалите данные (я уверен, что для этого есть некоторый вариант использования... где-то).
0 голосов
/ 16 февраля 2011

Существует два подхода:

  • Описанный вами подход: сохранить данные, записанные сервлетом, во временный буфер, применить к ним необходимые изменения и записать их в выходной потокпосле завершения сервлета.

  • Подход balusc: создайте обертку для выходного потока, которая выполняет необходимые изменения на лету, и оберните выходной поток им.На самом деле, в примере balusc он не работает на лету - есть временный буфер, который записывается в выходной поток во время операции flush().

В общем,последний подход лучше, поскольку он не требует дополнительной памяти и не приводит к накладным расходам с точки зрения задержки.Однако это может быть сложно реализовать для сложных модификаций.

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