2013年9月8日星期日

java.lang.IllegalStateException: Cannot forward after response has been committed in servlet 错误

写jsp程序时遇到这个错误,一般错误的原因是sendredirect后没有返回

protected void doPost() {
    if (someCondition) {
        sendRedirect();
    }
    forward(); // This is STILL invoked when someCondition is true!
}

解决方法是加一个return或加一个else分支:

protected void doPost() {
    if (someCondition) {
        sendRedirect();
        return;
    }
    forward();
}

protected void doPost() {
    if (someCondition) {
        sendRedirect();
    }else{
    forward(); 
}
}

但是我的代码中sendRedirect是最后一句代码,后面跟着return,居然还有这个运行错误.

原因在于jsp中response具有缓存大小的限制,如果达到这个限制,那么所有HTTP response headers和写入的html代码都会发送回客户端,也就是response is committed.虽然你没有显式指定返回.

检查了一下我的代码,原来我为了测试用如下代码向response写入了很多单词:
  PrintWriter out = response.getWriter();
  
  for( String str: result )
   out.print(str + " ");
  out.println(result.size());
  out.close();

注释掉这段代码之后就可以正常运行了.

参考:
1.http://stackoverflow.com/questions/2123514/java-lang-illegalstateexception-cannot-forward-after-response-has-been-committe/2125045#2125045
2.http://stackoverflow.com/questions/12693975/java-lang-illegalstateexception-cannot-call-sendredirect-after-the-response-h

没有评论:

发表评论