一、问题
HTTP Status 500 - Circular view path [/index.html]: would dispatch back to the current handler URL [/index.html] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
二、原因分析
(1)在springmvc.xml配置文件中找到视图解析器,查看源码可知SpringMVC默认的视图解析器就是JstlView的实例,如下图所示。
(2)进入JstlView.java, 该对象继承自InternalResoureView。JstlView用来封装JSP或者同一Web应用中的其他资源,它将model对象作为request请求的属性值暴露出来, 并将该请求通过javax.servlet.RequestDispatcher转发到指定的URL。Spring认为, 这个view的URL是可以用来指定同一web应用中特定资源的,是可以被RequestDispatcher转发的。也就是说,在页面渲染(render)之前,Spring会试图使用RequestDispatcher来继续转发该请求。
(3)进入InternalResoureView.java可以发现,如果view name和path是相同的字符串,根据Spring的转发规则,就等于让自己转发给自己,会陷入死循环。所以Spring会检查到这种情况,于是抛出Circular view path异常。还有一种情况是日志虽然报了这段异常,但是原因其实是viewResolver配置错误。
(4)陷入死循环如下图。
三、解决方案
修改view或者path的名字,让两者不同名。