这与Spring MVC测试无关。
当你不声明a时ViewResolver,Spring注册一个默认值InternalResourceViewResolver,该默认值创建的实例JstlView以呈现View。
的JstlView类扩展InternalResourceView其是
同一Web应用程序中的JSP或其他资源的包装。将模型对象公开为请求属性,然后使用javax.servlet.RequestDispatcher将请求转发到指定的资源URL。
该视图的URL应该用于指定Web应用程序中的资源,适用于RequestDispatcher的forward或include方法。
大胆是我的。。换句话说,视图渲染之前,将尝试获得RequestDispatcher到其中forward()。在执行此操作之前,它会检查以下内容
if (path.startsWith("/") ? uri.equals(path) : uri.equals(StringUtils.applyRelativePath(uri, path))) { throw new ServletException("Circular view path [" + path + "]: would dispatch back " + "to the current handler URL [" + uri + "] again. Check your ViewResolver setup! " + "(Hint: This may be the result of an unspecified view, due to default view name generation.)");}path视图名称在哪里,从中返回的名称
@Controller。在此示例中,即
preference。变量uri保存正在处理的请求的
uri /context/preference。
上面的代码意识到,如果要转发到
/context/preference,则相同的
servlet(因为相同的servlet处理了前一个)将处理请求,并且你将陷入无限循环。
当你使用特定的and 声明
a ThymeleafViewResolver和
a ServletContextTemplateResolver时,它会以不同的方式构建,并为它提供如下路径prefixsuffixView
WEB-INF/web-templates/preference.html
ThymeleafView实例使用以下命令相对于ServletContext路径 定位文件
ServletContextResourceResolver
templateInputStream = resourceResolver.getResourceAsStream(templateProcessingParameters, resourceName);`
最终
return servletContext.getResourceAsStream(resourceName);
这将获得相对于
ServletContext路径的资源。然后,它可以使用
TemplateEngine生成HTML。这里不可能发生无限循环。



