Thymeleaf 视图解析器和 SpringMVC 3 InternalResourceViewResolver 一起使用 [英] Thymeleaf view resolver and SpringMVC 3 InternalResourceViewResolver together

查看:97
本文介绍了Thymeleaf 视图解析器和 SpringMVC 3 InternalResourceViewResolver 一起使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在努力实现,以便 Thymeleaf 可以与 Spring MVC 3 一起工作并使用 2 个视图解析器,一个用于 jsp,一个用于 html 模板.我希望我的 Thymeleaf ServletContextTemplateResolver 首先被要求尝试解析一个视图,如果它找不到一个,请传递给 Spring MVC 3 InternalResourceViewResolver.

I'm trying to achieve so that Thymeleaf can work together with Spring MVC 3 and use 2 view resolvers, one for jsp and one for html templates. I'd like my Thymeleaf ServletContextTemplateResolver to be asked first to attempt to resolve a view and if it can't find one, pass on to the Spring MVC 3 InternalResourceViewResolver.

我通过这种方式将 ServletContextTemplateResolver 的顺序值设置为 1:

I've set the order value of ServletContextTemplateResolver to 1 this way:

<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:

and the order of InternalResourceViewResolver" to 2 in the same fashion:

<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>

据我从文档中了解到,最后查阅最高顺序.

As I understand it from the docs the highest order is consulted last.

在views"文件夹中,我有一个index.jsp"和一个index.html",我的一般想法是第一个 ServletContextTemplateResolver 将被要求尝试解析,如果有,它将解析为index.html"是一种,只有当 ServletContextTemplateResolver 找不到合适的视图时,才会要求 InternalResourceViewResolver 解析视图.

In the "views" folder I have one "index.jsp" and one "index.html" and my general idea is that first ServletContextTemplateResolver will be asked to attempt resolving and it will resolve to "index.html" if there is one, and only if no suitable view can be found by ServletContextTemplateResolver will the InternalResourceViewResolver be asked to resolve the view.

但我得到的结果是,当 InternalResourceViewResolver 处于活动状态时,它无论如何都会解析所有视图.如果我将其注释掉,则 ServletContextTemplateResolver 解析正常.

But the result I have is that when InternalResourceViewResolver is active, it resolves all views no matter what. If I comment it out then ServletContextTemplateResolver resolves fine.

这些解析器不可能以这种方式配对吗?有什么选择?

Are these resolvers impossible to pair up in this fashion? What's the alternative?

推荐答案

Thymeleaf 在尝试在其视图解析器之外查找页面而不是将其传递到下一个视图解析器时会引发错误.通过设置 excludeViewNames,跳过尝试在 Thymeleaf 中解析视图名称.请参阅下面的示例代码.

Thymeleaf throws an error when trying to find pages outside of their view resolver instead of passing it onto the next view resolver. By setting the excludeViewNames, skips trying to resolve the view name within Thymeleaf. See my example code below.

/**
 * 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;
}

这篇关于Thymeleaf 视图解析器和 SpringMVC 3 InternalResourceViewResolver 一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆