Cannot forward after response has been committed

来源:互联网 发布:淘宝用一键复制好吗 编辑:程序博客网 时间:2024/05/18 04:00

今天用servlet写了一个简单的小测试类,程序能正常的启动,服务也没有问题.
页面也能正常显示,但是就是后台报了一个:

java.lang.RuntimeException: java.lang.IllegalStateException: Cannot forward after response has been committed    at com.test.servlet.BaseServlet.service(BaseServlet.java:53)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)    at java.lang.Thread.run(Thread.java:724)Caused by: java.lang.IllegalStateException: Cannot forward after response has been committed    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:349)    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)    at com.test.servlet.BaseServlet.service(BaseServlet.java:50)    ... 17 more

由翻译可知,这个错误就是:已经响应过了之后就不能在跳转了.
查看程序发现前面已经已经response过了,后面的return 又要跳转了,所以程序报了这样的一个错误!

public String find(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        out.print("    This is ");        out.print(this.getClass());        out.println(", using the GET method");        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();        return "/index.jsp";    }

所以程序修改为下面的代码就不会再出现上面的问题了.

public String find(HttpServletRequest request, HttpServletResponse response)            throws ServletException, IOException {        response.setContentType("text/html");        PrintWriter out = response.getWriter();        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        out.print("    This is ");        out.print(this.getClass());        out.println(", using the GET method");        out.println("  </BODY>");        out.println("</HTML>");        out.flush();        out.close();        return null;    }

所以还是需要了解request和response的用法.

0 0