Thymeleaf查看解析器和SpringMVC 3 InternalResourceViewResolver在一起

时间:2014-03-27 15:02:43

标签: spring-mvc thymeleaf

我正在尝试实现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就可以解决了。

这些解析器无法以这种方式配对吗?有什么替代方案?

1 个答案:

答案 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;
}