1

在提交响应后,因为这里的重定向语句应该给出异常,但如果这个重定向 statemnet 在 if 块中,它不会这样做。但是如果它不在 if 块中,它确实会给出异常。我已经显示了相同的语句(带有标记的星号)在下面的两个地方。你能告诉我原因吗?

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 语句中,如果块中的语句也应该像这个一样给出异常,但它没有这样做。为什么?

***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);

    }


}               
4

2 回答 2

2

来自servlet 规范,5.3:

如果响应尚未提交,这些方法将具有提交响应并终止它的副作用。调用这些方法后,servlet 不应再向客户端输出任何内容。如果在调用这些方法后将数据写入响应,则数据将被忽略。

如果数据已经写入响应缓冲区,但没有返回给客户端(即响应未提交),则必须清除响应缓冲区中的数据,并用这些方法设置的数据替换。如果响应已提交,这些方法必须抛出 IllegalStateException。

我认为这两个规范涵盖了您的所有情况。

于 2009-06-21T08:59:24.003 回答
1

尝试在第一个块结束之前放置一个 response.flush ,尽可能多地写入,但除非它被发送出缓冲区,否则它仍然没有提交。

于 2010-12-01T21:20:08.267 回答