spring-mvc - 解析模板时出错 "pages",模板可能不存在或无法由任何已配置的模板解析器访问

标签 spring-mvc tiles thymeleaf

我使用 Spring 与 Thymeleaf 和 Tiles 做了一个项目,其结构如下:

enter image description here

我已经配置了我的 Spring-Servlet :

<bean id="templateResolver" 
                class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
                <property name="prefix" value="/WEB-INF/templates/" />
                <property name="suffix" value=".html" />
                <property name="characterEncoding" value="UTF-8" />
                <property name="templateMode" value="HTML5" />
        </bean>

        <bean id="tilesConfigurer" 
                class="org.thymeleaf.extras.tiles2.spring4.web.configurer.ThymeleafTilesConfigurer">
                <property name="definitions">
                        <list>
                                <value>/WEB-INF/tiles-defs.xml</value>
                        </list>
                </property>
        </bean>
        <bean id="tilesViewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
                <property name="viewClass" 
                        value="org.thymeleaf.extras.tiles2.spring4.web.view.ThymeleafTilesView" />
                <property name="templateEngine" ref="templateEngine" />
                <property name="characterEncoding" value="UTF-8" />
        </bean>
        <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
                <property name="templateResolver" ref="templateResolver" />
                <property name="additionalDialects">
                        <set>
                                <bean class="org.thymeleaf.extras.tiles2.dialect.TilesDialect" />
                        </set>
                </property>
        </bean>  

我的瓷砖定义是:

<tiles-definitions>
    <definition name="layout" template="layout">
        <put-attribute name="header"   value="header" />
        <put-attribute name="menu"   value="menu" />
        <put-attribute name="footer" value="footer" />
        <put-attribute name="body" />

    </definition>

    <definition name="usersView" extends="layout">
        <put-attribute name="body"   value="pages :: users" />
    </definition>
 </tiles-definitions>

这会给我以下错误:

Error resolving template "pages", template might not exist or might not be accessible by any of the configured Template Resolvers 

但是当我将 users.html 页面移动到模板文件夹并将我的图 block 定义为

<definition name="usersView" extends="layout">
        <put-attribute name="body"   value="users" />
    </definition>

它工作正常。

所以问题是 Thymeleaf 可以接受我的文件夹结构吗?如果是,怎么办?

最佳答案

是的,可以通过使用viewNames属性

只需将 Spring-Servlet.xml 更改为

<bean id="templateResolver" 
                class="org.thymeleaf.templateresolver.ServletContextTemplateResolver">
                <property name="prefix" value="/WEB-INF/" />
                <property name="suffix" value=".html" />
                <property name="characterEncoding" value="UTF-8" />
                <property name="templateMode" value="HTML5" />

        </bean>

        <bean id="tilesConfigurer" 
                class="org.thymeleaf.extras.tiles2.spring4.web.configurer.ThymeleafTilesConfigurer">
                <property name="definitions">
                        <list>
                                <value>/WEB-INF/tiles-defs.xml</value>
                        </list>
                </property>
        </bean>
        <bean id="tilesViewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
                <property name="viewClass" 
                        value="org.thymeleaf.extras.tiles2.spring4.web.view.ThymeleafTilesView" />
                <property name="templateEngine" ref="templateEngine" />
                <property name="characterEncoding" value="UTF-8" />
                <property name="order" value="1" />
                <property name="viewNames" value="templates/*,pages/*" />
        </bean>
        <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
                <property name="templateResolver" ref="templateResolver" />
                <property name="additionalDialects">
                        <set>
                                <bean class="org.thymeleaf.extras.tiles2.dialect.TilesDialect" />
                        </set>
                </property>
        </bean> 

以及您的图 block 定义

<tiles-definitions>
    <definition name="layout" template="templates/layout">
        <put-attribute name="header"   value="templates/header" />
        <put-attribute name="menu"   value="templates/menu" />
        <put-attribute name="footer" value="templates/footer" />
        <put-attribute name="body" />
    </definition>

    <definition name="pages/usersView" extends="layout">
        <put-attribute name="body"   value="pages/users" />
    </definition>
 </tiles-definitions>

说明:

我们已经在解析器的前缀中定义了根文件夹

<property name="prefix" value="/WEB-INF/" />

并将其扩展

 <property name="viewNames" value="templates/*,pages/*" />

到所需的文件夹以及您创建的任何新 View 文件夹也应该在此属性中重定向或转发

关于spring-mvc - 解析模板时出错 "pages",模板可能不存在或无法由任何已配置的模板解析器访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24260520/

相关文章:

java - 如何使用 thymeleaf 检查对象列表是否包含字符串?

java - 在哪里以及如何下载 Spring jar?

java - 如何检索在服务器 (Tomcat) 上上传的文件的正确 URL(使用 spring MVC)

c# - 如何更快地加载/卸载图 block block (C#)

java - 何时为 Tiles 使用 View Preparer

css - 如何创建网格/平铺 View ?

spring - 以编程方式解析 Thymeleaf 模板

java - Spring MVC - 在 Controller 中默认设置值

hibernate - 如何动态更改 Spring Boot 实体中的架构?

html - 如何将变量值附加到 th :href in thymeleaf