当前位置: 首页 > 知识库问答 >
问题:

Spring中的嵌套Thymeleaf模板

公孙宏畅
2023-03-14

短版

使用Spring时,如何在Thymeleaf中创建嵌套模板?Spring中的th:object属性中似乎不支持星号符号(“*{mailingAddress}”)。是否有变通/不同的标签可供使用?

长版本

例如,假设我有以下课程:

class Address { String street; }
class Person { Address mailingAddress; Address shippingAddress; }
class Order { int orderNo; Person customer; } 

所以我做了一个地址。htmlThymeleaf模板:

<span th:text="*{street}"></span>

我们用一个样本地址来测试它。看起来不错。

我做了一个person.htmlThymeleaf模板,引用这样的地址:

<span th:text="*{firstName}"></span>
<span th:object="${person.shippingAddress}">
    <span th:include="fragments/address :: address"></span>
</span>

我们用一个例子来测试它。我甚至可以引用相同的模板,并将上下文设置为${person.mailingAddress}。到现在为止,一直都还不错。

现在让我们制作订单模板。只是,嘿,等等。前面,在我们的人物中。html文件我们说的是${person.shippingAddress},但现在我们需要它说${order.customer.shippingAddress}。如果我没有使用Spring,我会将以下内容放入person中。html

<span th:text="*{firstName}"></span>
<span th:object="*{shippingAddress}">
    <span th:include="fragments/address :: address"></span>
</span>

这样,不管我到达这里的路径是什么,我所要关心的就是我当前的上下文有一个shipping地址。然后,我可以直接使用person.html,也可以在我的order.html模板中使用。

不幸的是,我在Spring,所以我得到以下例外:

org.thymeleaf.exceptions.TemplateProcessingException: 
    The expression used for object selection is *{shippingAddress},
    which is not valid: only variable expressions (${...}) are
    allowed in 'th:object' attributes in Spring-enabled environments. 
    (include:510)
at org.thymeleaf.spring4.processor.attr.SpringObjectAttrProcessor.validateSelectionValue(SpringObjectAttrProcessor.java:73)
at org.thymeleaf.standard.processor.attr.AbstractStandardSelectionAttrProcessor.getNewSelectionTarget(AbstractStandardSelectionAttrProcessor.java:69)
at org.thymeleaf.processor.attr.AbstractSelectionTargetAttrProcessor.processAttribute(AbstractSelectionTargetAttrProcessor.java:61)

若要继续,我必须复制所有嵌套模板。在这个例子中,我将有一个人。htmlwithth:object=“${person.mailingAddress}”调用地址。html,以及一份person的副本。html调用orderCustomer。html其中我们将行更改为th:object=“${order.customer.mailingAddress}”,但在其他方面是相同的。

有没有一种方法可以让我重复使用模板?


共有1个答案

祁俊喆
2023-03-14

您可以向github中的thymeleaf开发人员报告一个bug,或者通过项目添加此功能并说服Daniel Fernández接受它。

https://github.com/thymeleaf/thymeleaf/issues

否则,他在StackOverflow中可用。您只需向他发送一条消息,说明集成此功能的可能性

https://stackoverflow.com/users/550664/daniel-fern安德斯

除此之外,我们没有什么可以做的,而是坚持将th:object=“${person.mailingAddress}”和th:object=“${order.customer.mailingAddress}”放在每次导入之外的方法。

 类似资料:
  • 我正在使用Spring Boot和Thymeleaf为我的应用程序创建一个登录页。为此,我需要呈现所有包含容器的主机对象的列表。以下是相关代码: 现在,我想遍历所有服务器,并在表中显示关于每个容器的信息。我的Thymeleaf模板如下所示: 我的问题是访问容器属性的部分(由注释标记)。每次我都会得到一个SpringEL异常。如果我删除并将其替换为会显示容器的String版本,因此我可以访问对象和它

  • 但是,我必须验证manager和operator的id是否有效,也就是说,我将验证user表中是否有匹配的id。 所以我想知道如何实现这种验证? 更新1:使用验证器

  • 我有一个使用Hibernate/JPA的持久性Spring Boot应用程序。 我正在使用事务来管理我的数据库持久性,并且我正在使用注释来定义应该以事务方式执行的方法。 在持久化时,我有三个主要的事务粒度级别: 要保留的实体批次 要保留的单个实体 保留实体的单一数据库操作 因此,在考虑整个持久性流量时,您可以想象我有三个级别的嵌套事务。 第2层和第3层之间的交互如我所愿透明地工作,因为在没有为事务

  • 所以我想构建一个具有以下结构的项目: 现在,模块1和模块2是模块3的依赖项。 问题1:这种方法是错误的吗? 问题2:当我实现这个时,项目的封装结构为父pom和模块1的pom,而模块1、模块2和模块3的子模块的封装结构为jar。现在,当我运行mvn clean install时,我得到以下错误:

  • 了解如何在 Dreamweaver 中创建用于控制共享设计元素的页面中的内容的嵌套模板。 嵌套模板是指其设计和可编辑区域都基于另一个模板的模板。嵌套模板对于控制共享许多设计元素的站点页面中的内容很有用,但在各页之间有些差异。例如,基本模板中可能包含更宽广的设计区域,并且可以由站点的许多内容提供者使用,而嵌套模板可能进一步定义站点内特定部分的页面中的可编辑区域。 基本模板中的可编辑区域被传递到嵌套模

  • 本文向大家介绍SpringBoot中的Thymeleaf模板,包括了SpringBoot中的Thymeleaf模板的使用技巧和注意事项,需要的朋友参考一下 一、前言     Thymeleaf 的出现是为了取代 JSP,虽然 JSP 存在了很长时间,并在 Java Web 开发中无处不在,但是它也存在一些缺陷: 1、JSP 最明显的问题在于它看起来像HTML或XML,但它其实上并不是。大多数的JS