Thymeleaf 教程

可参数化的片段签名

为了为模板片段创建更像函数的机制(函数调用时可以传递参数),可使用 th:fragment 属性定义一个可以指定一组参数的片段:

<div th:fragment="frag (onevar,twovar)">
    <p th:text="${onevar} + ' - ' + ${twovar}">...</p>
</div>

上面名为 frag 的片段,接收两个参数,分别是 onevar twovar

如果要调用指定了参数的片段,需要使用下面两种语法中的一种来从 th:insert th:replace 属性引用片段:

语法一:

<div th:replace="::frag (${value1},${value2})">...</div>

语法二:

<div th:replace="::frag (onevar=${value1},twovar=${value2})">...</div>

注意,语法一指定参数的顺序和片段定义参数的顺序一致。语法二指定参数的顺序和片段定义参数的顺序可以不一致,它的顺序并不重要,因为它使用参数名匹配,例如:

<div th:replace="::frag (twovar=${value2},onevar=${value1})">...</div>

不带片段参数 & 片段局部变量

即使片段在定义时没有指定参数,如下:

<div th:fragment="frag">
    ...
</div>

我们依然可以使用上面的第二种语法来调用它们,例如:

<div th:replace="::frag (onevar=${value1},twovar=${value2})"></div>

上面代码当于 th:insert th:with 属性的组合:

<div th:insert="::frag_not_args" th:with="onevar=${value1},twovar=${value2}"></div>

如果你使用 th:replace 不能正常工作,局部变量 onevar 和 twovar 未定义,为 null。如下:

<div th:replace="::frag" th:with="onevar=${value1},twovar=${value2}"></div>

渲染后,输出结果:

<div>
    <p>null - null</p>
</div>

请注意,这种为片段指定局部变量的做法(无论它是否有参数签名)都不会导致上下文在执行前被清空。片段仍然能够像目前一样访问在调用模板处使用的每个上下文变量。

th:assert 模板内断言

th:assert 属性可以指定一个逗号分隔的表达式列表,该列表中的表达式应该被求值,并为每次求值均为 true,否则会引发异常。

<div th:assert="${onevar},(${twovar} != 43)">...</div>

这对于在片段签名处验证参数非常有用:

<header th:fragment="contentheader(title)" th:assert="${!#strings.isEmpty(title)}">...</header>

上面代码在定义名为 contentheader 的片段时,指定了一个 title 参数。同时,使用 th:assert 属性对 title 参数进行了断言。如果 title 为空,则 Thymeleaf 将抛出异常。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号