一般来说,网站会有一些共享的常见的页面组件,如页眉,页脚,菜单等,我们可以使用布局来共享它们, Thymeleaf 很好的支持了这种功能,不需要依赖其他布局引擎,例如: Apache Tiles
。
本文内容基于 Thymeleaf3.0 。
Thymeleaf 有两种主要的布局方式,各有优势,配合使用更佳。
布局方式 | 说明 | 优劣性 |
---|---|---|
包含式布局(include style) |
Thymeleaf标准布局。通过在每个视图中直接嵌入公共页面组件代码来生成页面。 | 使用简单,但不利于维护。 |
分层式布局(hierarchical style) |
由布局方言提供支持。模板通常使用父子关系创建,从一般的部分(布局)到具体的部分(子视图;例如页面内容) | 模块化维护简单,但配置更复杂。 |
标准布局系统
包含式布局★
包含式布局 ,也称之为 标准布局 ,十分简单,先定义模板片段,再引用片段即可。
定义片段
定义片段需要使用 th:fragment
,片段只是 th:fragment
所在标签及子标签内容。所有片段都可以在一个文件中定义或在单独的文件中定义。
当前片段位于
classpath:templates/fragments/footer.html
。
1 |
|
引用片段
引用片段语法: th:引用方式="~{templatename :: selector}"
。
片段表达式(
~{}
)是在 Thymeleaf 3.0 引入的,为向上兼容,引用片段时可以不使用~{}
包含。
语法 | 说明 |
---|---|
引用方式 | Thymeleaf 提供了三种 引用方式 。 |
片段模板名称( templatename ) |
可以是文件, this 或 没有关键字。 |
片段选择器( selector ) |
片段名称 或 标记选择器 。 |
1 |
|
作用效果
1 |
|
片段表达式
片段表达式 可以将片段做对象使用,其有三种格式。
~{templatename::selector}
templatename
: 模板名称,包含了相对模板根路径的位置。
selector
: 标记选择器,可以只是片段名称,也可以使用完善的 标记选择器语法 。
由于标记选择器的强大,甚至可以使用 id选择器(
#id
)直接选择片段,而不需要th:fragment
。
~{templatename}
在 th:insert
/ th:replace
标签中使用必须由模板解析器解析。
~{::selector} / ~{this::selector}
优先从当前模板查找片段,若没找到,会从模板根路径开始遍历查找匹配。
引用方式
Thymeleaf 提供了三种片段引用方式。
片段引用方式 | 说明 |
---|---|
th:insert |
插入指定的片段到引用标签中。 |
th:replace |
使用指定的片段替换引用的标签。 |
th:include |
只插入片段内容(不包括标签)到引用标签中, v3.0后不推荐使用。 |
下面通过示例,感受一下三种方式的区别
定义片段,当前片段位于 classpath:templates/fragments/footer.html
。
1 | <p th:fragment="copyright"> |
使用三种方式引用片段。
1 | <body> |
三种引用方式的作用效果。
1 | <body> |
更多特性
Thymeleaf 模板布局还拥有很多特性和高级应用,这里列举了一些以供参考。
布局方言
布局方言 实际上是一个基于 Thymeleaf方言
的第三方扩展包,可以轻松的完成分层式布局。
Spring Boot 1.x
中包含了布局方言,但在Spring Boot 2.x
中被移除。
1 | <!-- https://github.com/ultraq/thymeleaf-layout-dialect --> |
可以在页面中引入命名空间,使 IDE 更好的支持。
1 | <html xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"> |
分层式布局★
分层式布局需要使用 布局方言 (Layout Dialect)。
定义布局装饰器
可以定义一个通用的布局样式(父页面),使用 layout:fragment
定义布局片段(子页面占位符)。
当前片段位于
classpath:templates/layout/default.html
。
1 |
|
引用装饰器
在需要被装饰的页面(子页面),使用 layout:decorate
引用装饰器,并使用 layout:fragment
设置布局片段的具体内容。
子页面并不是被简单的
th:replace
,<head></head>
的内容也会一并被合理带入。
1 |
|
方言扩展
布局方言
不仅提供了分层式布局方法,还扩展了标准布局的语法,可以直接替代标准布局方言。例如: layout:fragment
, layout:include
等。具体参考 官方文档。