У меня есть сервлет с переопределенным методом 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.