版权声明:本文为博主原创文章,转载请申明出处,感谢。 https://blog.csdn.net/shichimiyasatone/article/details/86526292
问题情境:
问题出现在尝试代码实现SpringMVC主要流程时,DispatcherServlet中service()方法执行到最后一步报错。
// 此句代码执行时抛异常,页面405
request.getRequestDispatcher(result.getView()).forward(request, response);
控制台的异常信息:
java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:326)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:316)
at com.yangyi.dispatcher.DispatcherServlet.service(DispatcherServlet.java:81)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
// 此处省略部分打印内容
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
页面显示:
问题原因:
在DispatcherServlet中重写service()方法时没有去掉自动添加的super.service(request, response),导致此处显示调用父类HttpServlet的service()方法。在父类的该方法中,调用了doGet()或doPost()方法。这两个方法默认返回405或者400,所以页面显示405错误或400错误。又因为本次请求在父类的service()方法中已经响应完成,再次尝试转发或重定向将会抛出IllegalStateException异常。
HttpServlet中doGet()和doPost()方法源码实现内容为:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取协议
String protocol = req.getProtocol();
//获取http.method_get_not_supported的国际化字符串
String msg = lStrings.getString("http.method_get_not_supported");
if(protocol.endsWith("1.1")) {
//如果是HTTP/1.1,返回405禁止访问方法错误
resp.sendError(405, msg);
} else {
//如果不是HTTP/1.1,返回400错误的请求错误
resp.sendError(400, msg);
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_post_not_supported");
if(protocol.endsWith("1.1")) {
resp.sendError(405, msg);
} else {
resp.sendError(400, msg);
}
}
解决办法:
在仅重写service()方法时,不显示调用父类service()方法,将eclipse自动添加的super.service(request, response)去掉即可。
参考:
https://blog.csdn.net/sinat_32560085/article/details/70144760