为了为模板片段创建更像函数的机制(函数调用时可以传递参数),可使用 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 属性可以指定一个逗号分隔的表达式列表,该列表中的表达式应该被求值,并为每次求值均为 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 将抛出异常。