sendRedirect () НЕ выдает исключение IllegalStateException с сервлетом 3.0 в GlassFish 3.1.1 - PullRequest
0 голосов
/ 10 февраля 2012

У меня есть сервлет с переопределенным методом doGet в Dynamic Web App 3.0, ориентированный на GlassFish 3.1.

Я учусь на OCEJWCD экзамен и пытаюсь запомнить, какие обстоятельствавыбросить какие исключения.

Поскольку Tomcat 6.0 поддерживает только API Servlet 2.5, мне нужно использовать Glassfish 3, и я очень запутался в следующей ситуации.

Многочисленные старые источники укажите, что:

Ответ фиксируется, как только сервлет начинает что-либо записывать в выходной поток.Если вы попытаетесь перенаправить после подтверждения ответа, вы получите ошибку IllegalStateException.

Однако Servlet 3.0 Окончательная спецификация В разделе 5.3 говорится:

Если данные былизаписанные в буфер ответов, но не возвращенные клиенту (т. е. ответ не зафиксирован), данные в буфере ответов должны быть очищены и заменены данными, установленными этими методами.Если ответ зафиксирован, эти методы должны выдать исключение IllegalStateException

Что я хочу знать, учитывая, что PrintWriter.print() означает принятие ответа, почему эти строки не выполняютсяthrow IllegalStateException?

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    String url = "http://someurl.com/";
    PrintWriter out = response.getWriter();
    out.print("This will be written into response buffer");
    response.sendRedirect(url); // sendRedirect() after writing into buffer
}

Я должен отметить, что я могу получить исключения из журнала сервера GlassFish, я ясно вижу, что HttpServletRequest.getRequestDispatcher().forward(req,res);, за которым следует HttpServletResponse.sendRedirect(url);, действительно выдает IllegalStateException в контейнере GlassFish.

1 Ответ

1 голос
/ 10 февраля 2012

Дело в том, что PrintWriter.print() может зафиксировать ответ. Это происходит, если буфер заполнен или буферизация отсутствует вообще. Вы можете проверить его размер, позвонив ServletResponse.getBufferSize().

ServletResponse.flushBuffer() или PrintWriter.flush() определенно передаст ответ.

Так что, если бы PrintWriter.print() передавал ответ, то HttpServletResponse.sendRedirect() действительно выкинул бы IllegalStateException.

См. Также спецификацию сервлета, раздел 5.1 Буферизация .

И, кстати, нет RequestDispatcher.dispatch(). ;)

...