我正在尝试实现Thymeleaf可以与Spring MVC 3一起使用并使用2个视图解析器,一个用于jsp,一个用于html模板。我想首先要求我的Thymeleaf ServletContextTemplateResolver尝试解析一个视图,如果找不到,请传递给Spring MVC 3 InternalResourceViewResolver。
我用这种方式将ServletContextTemplateResolver的顺序值设置为1:
<bean id="templateResolver"
class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".html" />
<property name="templateMode" value="HTML5" />
<property name="order" value="1" />
<property name="cacheable" value="false" />
</bean>
和InternalResourceViewResolver的顺序“以相同的方式为2:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
<property name="order" value="2" />
</bean>
正如我从文档中理解的那样,最后一次咨询最高顺序。
在“views”文件夹中,我有一个“index.jsp”和一个“index.html”,我的一般想法是,第一个ServletContextTemplateResolver将被要求尝试解析,如果有,它将解析为“index.html”是一个,只有当ServletContextTemplateResolver找不到合适的视图时,才会要求InternalResourceViewResolver解析视图。
但我得到的结果是当InternalResourceViewResolver处于活动状态时,无论如何都会解析所有视图。如果我发表评论,那么ServletContextTemplateResolver就可以解决了。
这些解析器无法以这种方式配对吗?有什么替代方案?
答案 0 :(得分:4)
Thymeleaf在尝试查找其视图解析程序之外的页面时抛出错误,而不是将其传递到下一个视图解析程序。通过设置excludeViewNames,跳过尝试解析Thymeleaf中的视图名称。请参阅下面的示例代码。
/**
* Configures a {@link ThymeleafViewResolver}
*
* @return the configured {@code ThymeleafViewResolver}
*/
@Bean
public ThymeleafViewResolver thymeleafAjaxViewResolver()
{
String[] excludedViews = new String[]{
"login", "logout"};
AjaxThymeleafViewResolver resolver = new AjaxThymeleafViewResolver();
resolver.setTemplateEngine(templateEngine());
resolver.setOrder(1);
/*
* This is how we get around Thymeleaf view resolvers throwing an error instead of returning
* of null and allowing the next view resolver in the {@see
* DispatcherServlet#resolveViewName(String, Map<String, Object>, Locale,
* HttpServletRequest)} to resolve the view.
*/
resolver.setExcludedViewNames(excludedViews);
return resolver;
}