Будет ли вызов HttpServletResponse.reset () сбрасывать OutputStream, чтобы его можно было получить снова? - PullRequest
1 голос
/ 13 октября 2010

Вот ситуация. Пользовательский сервлет получает писателя, и он собирается выполнить некоторую работу, однако исключение случается, поэтому контроль принимается некоторой структурой сервлета. Фреймворк имеет возможность сообщать о проблеме непосредственно в браузере. Таким образом, он сбрасывает текущий ответ и получает выходной поток для сообщения о проблеме. Поскольку Writer уже взят из объекта ответа, он вызывает исключение. Итак, вопрос снова: должна ли функция сброса сделать забытый возвращаемый поток или записывающее устройство, или возникновение исключения является законным? Спецификация сервлета не дает четкого ответа, поэтому надеюсь на помощь сообщества. Да, я не только разработчик фреймворка сервлетов, но и разработчик контейнера сервлетов, поэтому мне нужно знать соответствующее поведение каждого компонента.

1 Ответ

6 голосов
/ 13 октября 2010

Спецификация сервлета выглядит как ясно и недвусмысленно на этом:

void reset()

Удаляет любые данные, которые существуют в буфере, а такжекод состояния и заголовки.Если ответ был зафиксирован, этот метод выдает IllegalStateException.

Другими словами, если в ответ было записано достаточно данных, чтобы буфер памяти был превышен, то эти данные будут «зафиксированы», то есть фактически отправлены клиенту.После этого момента ответ не может быть переопределен, и при попытке выдается исключение.

Если это целесообразно, рекомендуется буферизовать данные вашего ответа, чтобы исключить возможность возникновения исключения.поднял на полпути через генерацию данных.Это дает вам возможность отбросить его и вместо этого вывести ответ об ошибке.Однако это не всегда возможно по соображениям производительности и / или масштабируемости.

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