сервлет Java: response.sendRedirect () не дает исключение недопустимого состояния, если вызывается после коммита response.why? - PullRequest
1 голос
/ 21 июня 2009

после коммита ответа, как здесь, оператор перенаправления должен выдавать исключение, но он этого не делает, если это состояние состояния перенаправления в блоке block.but оно выдает исключение в том случае, если это не так, если block.i показал такой же оператор отмечены звездочки) в двух местах ниже. Можете ли вы сказать мне причину этого.

protected void doPost(HttpServletRequest request, HttpServletResponse response)          throws    ServletException, IOException {
            // TODO Auto-generated method stub
    synchronized (noOfRequests)
    {
        noOfRequests++;
        }
        PrintWriter pw=null;
        response.setContentType("text/html");
        response.setHeader("foo","bar");

// ответ принят из-за вышеприведенного утверждения

        pw=response.getWriter();
        pw.print("hello : "+noOfRequests);

// если я удаляю оператор ниже, этот же оператор присутствует в операторе if block.so в блоке if также должен выдавать исключение, как этот, но это не так. Почему?

***response.sendRedirect("http://localhost:8625/ServletPrc/login%  20page.html");


    if(true)
    {
                  //same statement as above
        ***response.sendRedirect("http://localhost:8625/ServletPrc/login%20page.html");
    }
    else{

        request.setAttribute("noOfReq", noOfRequests);
        request.setAttribute("name", new Name().getName());
        request.setAttribute("GmailId",this.getServletConfig().getInitParameter("GmailId") );
        request.setAttribute("YahooId",this.getServletConfig().getInitParameter("YahooId") );
        RequestDispatcher view1=request.getRequestDispatcher("HomePage.jsp");
        view1.forward(request, response);

    }


}               

Ответы [ 2 ]

2 голосов
/ 21 июня 2009

из спецификации сервлета , 5,3:

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

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

Я думаю, что эти две спецификации охватывают все ваши дела.

1 голос
/ 02 декабря 2010

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

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