1、th:text
- 可以对表达式或变量进行计算求值;
- 可以使用“+”进行文本拼接;
- 可以获取后端传过来的request作用域中的数据(包括Model、ModelAndView作用域)
- 如果文本中包含有HTML标签,不会对其进行解析。
2、th:utext
此标签与th:text标签功能几乎一样,唯一不同就是,如果文本中包含有HTML标签,会对其进行解析,并响应到客户端。
3、#{...}
#{}表达式的作用是从外部文件获取值,通常是key/value形式的property文件。它的强大在于通过简单的操作,就可以处理应用程序国际化的问题。(通常搭配着th:text使用)
4、${...}
它的作用是从thymeleaf上下文获取指定变量的值
${}的预定义变量
thymeleaf提供了一些预定义变量param、session和application,使用${}可以方便地获取这些变量的值:
- 获取当前名称为x的请求参数:${param.x}
- 获取当前session中名称为x的属性:${session.x}
- 获取当前ServletContext中名称为x的属性:${application.x}
可见,如果变量是一个对象的话,${}还可以通过点语法获取对象的属性值。如果要获取的属性是一个私有字段,则它必须提供一个get方法,否则属性值获取失败。
<p th:text="${title}">这是标题</p>
示例使用了Thymeleaf模板的变量表达式${...}用来动态获取P标签中的内容,如果当前程序没有启动或者当前上下文中不存在title变量,该片段会显示标签默认值“这是标题”;如果当前上下文中存在title变量并且程序已经启动,当前P标签中的默认文本内容将会被title变量的值所替换,从而达到模板引擎页面数据动态替换的效果
同时,Thymeleaf为变量所在域提供了一些内置对象,具体如下所示
# ctx:上下文对象
# vars:上下文变量
# locale:上下文区域设置
# request:(仅限Web Context)HttpServletRequest对象
# response:(仅限Web Context)HttpServletResponse对象
# session:(仅限Web Context)HttpSession对象
# servletContext:(仅限Web Context)ServletContext对象
结合上述内置对象的说明,假设要在Thymeleaf模板引擎页面中动态获取当前国家信息,可以使用#locale内置对象,示例代码如下
The locale country is: <span th:text="${#locale.country}">US</span>
上述代码中,使用th:text="${#locale.country}"动态获取当前用户所在国家信息,其中标签内默认内容为US(美国),程序启动后通过浏览器查看当前页面时,Thymeleaf会通过浏览器语言设置来识
当前用户所在国家信息,从而实现动态替换
5、*{...}
星号表达式与上文中的$表达式功能大致相同,二者最大的区别是:星号语法对选定对象而不是整个上下文的表达式求值。也就是说,只要没有选中的对象,美元和星号的语法就完全一样。
eg:
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="*{lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>
这完全等同于:
<div>
<p>Name: <span th:text="${session.user.firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="${session.user.nationality}">Saturn</span>.</p>
</div>
当然,美元和星号语法可以混合使用。
6、@{...}
@{}这个是thymeleaf中的链接,与th:src或th:href一起使用
<!-- Will produce 'http://localhost:8080/gtvg/order/details?orderId=3' (plus rewriting) -->
<a href="details.html"
th:href="@{http://localhost:8080/gtvg/order/details(orderId=${o.id})}">view</a>
<!-- Will produce '/gtvg/order/details?orderId=3' (plus rewriting) -->
<a href="details.html" th:href="@{/order/details(orderId=${o.id})}">view</a>
<!-- Will produce '/gtvg/order/3/details' (plus rewriting) -->
<a href="details.html" th:href="@{/order/{orderId}/details(orderId=${o.id})}">view</a>
注意:
-
th:href
是修饰符属性:一旦处理,它将计算要使用的链接 URL 并将该值设置为标记的href
属性。<a>
-
我们可以对 URL 参数使用表达式(如您在 中所见
orderId=${o.id}
)。所需的 URL 参数编码操作也将自动执行。 -
如果需要多个参数,这些参数将用逗号分隔:
@{/order/process(execId=${execId},execType='FAST')}
-
URL 路径中也允许使用变量模板:
@{/order/{orderId}/details(orderId=${orderId})}
-
/
以(eg: )开头的相对 URL/order/details
将自动以应用程序上下文名称为前缀。 -
如果 cookie 未启用或未知,则
";jsessionid=..."
可能会在相对 URL 中添加后缀,以便保留会话。这称为URL 重写response.encodeURL(...)
,Thymeleaf 允许您通过使用Servlet API 中的机制为每个 URL插入自己的重写过滤器。 -
该
th:href
属性允许我们(可选地)在我们的模板中有一个有效的静态href
属性,以便我们的模板链接在直接打开用于原型设计时仍然可以由浏览器导航。
该表达也可以与其他表达式结合使用:
eg:
<a th:href="@{${url}(orderId=${o.id})}">view</a>
<a th:href="@{'/details/'+${user.login}(orderId=${o.id})}">view</a>
7、片段表达式 ~{...}
片段表达式~{...}用来标记一个片段模板,并根据需要移动或传递给其他模板。其中,最常见的用法是使用th:insert或th:replace属性插入片段,示例代码如下:
<div th:insert="~{thymeleafDemo::title}"></div>
上述代码中,使用th:insert属性将title片段模板引用到该标签中。thymeleafDemo为模板名称,Thymeleaf会自动查找“/resources/templates/”目录下的thymeleafDemo模板,title为片段名称。
8、附加文本与文字替换
8.1、附加文本
文本,无论是文字还是评估变量或消息表达式的结果,都可以使用+
运算符轻松附加:
<span th:text="'The name of the user is ' + ${user.name}">
8.2、文字替换
文字替换允许轻松格式化包含来自变量的值的字符串,而无需在文字后面附加'...' + '...'
.
这些替换必须用竖线 ( |
) 包围,例如:
<span th:text="|Welcome to our application, ${user.name}!|">
这相当于:
<span th:text="'Welcome to our application, ' + ${user.name} + '!'">
文字替换可以与其他类型的表达式组合:
<span th:text="${onevar} + ' ' + |${twovar}, ${threevar}|">
在文字替换中只允许使用变量/消息表达式 ( ${...}
, *{...}
, )。没有其他文字 ( )、布尔/数字标记、条件表达式等。#{...}
|...|
'...'
9、算术运算
还可以使用一些算术运算:+
、-
、*
和。/
%
<div th:with="isEven=(${prodStat.count} % 2 == 0)">
请注意,其中一些运算符存在文本别名:( div
) /
、mod
( %
)。
10、比较器与等式
表达式中的值可以与>
, <
, >=
and<=
符号进行比较,==
and!=
运算符可用于检查是否相等(或不相等)。请注意,XML 规定<和>符号不能用于比较符号,我们应该使用<和>进行替换。
<div th:if="${prodStat.count} > 1">
<span th:text="'Execution mode is ' + ( (${execMode} == 'dev')? 'Development' : 'Production')">
其它比较符号的别名如下:
gt
(>
),lt
(<
),ge
(>=
),le
(<=
),not
(!
),eq
(==
),neq
/ne
(!=
).
11、条件表达式
语法:条件?then : else
<tr th:class="${row.even}? 'even' : 'odd'">
...
</tr>
条件表达式可以是变量 ( ${...}
, *{...}
)、消息 ( #{...}
)、URL ( @{...}
) 或文字 ( '...'
)。
条件表达式也可以使用括号嵌套:
<tr th:class="${row.even}? (${row.first}? 'first' : 'even') : 'odd'">
...
</tr>
也可以省略其他表达式,在这种情况下,如果条件为假,则返回空值:
<tr th:class="${row.even}? 'alt'">
...
</tr>