首页 文章

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

提问于
浏览
2

我正在尝试实现,以便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 回答

  • 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;
    }
    

相关问题