Servlets 遇到了。因此,这与前一节中解释的问题基本相同

Servlets 遇到了。因此,这与前一节中解释的问题基本相同,servlets,response,illegalstateexception,forward,requestdispatcher,Servlets,Response,Illegalstateexception,Forward,Requestdispatcher,解决方案很明显,只是不要在JSP文件中编写Java代码。这是普通Java类(如Servlet或过滤器)的职责。另请参见以了解如何正确使用servlet 另见: 与您的具体问题无关,您的JDBC代码正在泄漏资源。也要解决这个问题。有关提示,请参见在转发或重定向流时,您应该添加return语句 例如: 如果是货代 request.getRequestDispatcher("/abs.jsp").forward(request, response); return; 如果重

解决方案很明显,只是不要在JSP文件中编写Java代码。这是普通Java类(如Servlet或过滤器)的职责。另请参见以了解如何正确使用servlet


另见:


与您的具体问题无关,您的JDBC代码正在泄漏资源。也要解决这个问题。有关提示,请参见

在转发或重定向流时,您应该添加return语句

例如:

如果是货代

    request.getRequestDispatcher("/abs.jsp").forward(request, response);
    return;
如果重定向

    response.sendRedirect(roundTripURI);
    return;

即使添加return语句也会引发此异常,唯一的解决方案是以下代码:

if(!response.isCommitted())
// Place another redirection

这是因为您的servlet正在尝试访问一个不再存在的请求对象。。 servlet的forward或include语句不会停止方法块的执行。它继续到方法块的结尾或第一个返回语句,就像任何其他java方法一样

解决此问题的最佳方法就是根据您的逻辑动态设置页面(您假设在其中转发请求)。即:

protected void doPost(request , response){
String returnPage="default.jsp";
if(condition1){
 returnPage="page1.jsp";
}
if(condition2){
   returnPage="page2.jsp";
}
request.getRequestDispatcher(returnPage).forward(request,response); //at last line
}
最后一行只向前走一次

您还可以在每次forward()之后使用return语句修复此问题,或者在if…else块中放入每个forward()

        super.service(req, res);
然后它对我来说很好

Bump

我只是犯了同样的错误。我注意到我正在调用
super.doPost(请求,响应)重写
doPost()
方法以及显式调用超类构造函数时

    public ScheduleServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
当我注释掉
super.doPost(请求,响应)之后
doPost()
语句中它工作得非常好

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //super.doPost(request, response);
        // More code here...

}

不用说,我需要重新阅读
super()
最佳实践:p

在返回转发方法之后,您可以简单地执行以下操作:

return null;

它将打破当前范围。

很难看到这样的情况,但在转发之前,您似乎已经发送了一些输出。请您打印完整的代码,并检查您是否有任何过滤器?有一个中断,您的意思是
break?这意味着代码在某个
for
循环中,而
循环中的
forward()
在循环过程中被重复调用(这是不正确的,您应该在循环后只调用forward一次,或者取消循环,因为它显然不需要)@BalusC你对这个相关问题有什么想法吗@confile:我不做Grails,但基于调用堆栈,它仍然在执行
forward()
调用,而它不应该这样做。我熟悉的JSF也会这样做,除非您显式调用
FacesContext\responseComplete()
。这个相关的问题(我使用关键字“grails阻止呈现响应”)可能会有所帮助:@BalusC grails基本上是Java,但问题与servlet有关。你知道我还能做什么吗。我在每次渲染后都会返回,并按照您的建议重定向和转发。@confile:我知道。我已经回答了原因:Grails仍然在执行一个
forward()
调用,而它不应该这样做。解决方案在功能上是显而易见的:告诉它不要这样做。它并不知道您已经以编程方式接管了Grails应该做的工作:处理响应。从技术上讲,我不知道如何告诉Grails这一点。但是我知道很多其他MVC框架都支持这一点(被指示不要自己处理响应),比如JSF、Spring MVC、Wicket等等。如果这在Grails中是不可能的,我会感到惊讶。
    request.getRequestDispatcher("/abs.jsp").forward(request, response);
    return;
    response.sendRedirect(roundTripURI);
    return;
if(!response.isCommitted())
// Place another redirection
protected void doPost(request , response){
String returnPage="default.jsp";
if(condition1){
 returnPage="page1.jsp";
}
if(condition2){
   returnPage="page2.jsp";
}
request.getRequestDispatcher(returnPage).forward(request,response); //at last line
}
        super.service(req, res);
    public ScheduleServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //super.doPost(request, response);
        // More code here...

}
return null;