https://blog.csdn.net/m0_38043362/article/details/78064177
Thymeleaf表达式语法以及日期格式化
2017年09月22日 16:18:47 试水流连 阅读数:10693
版权声明:本文为博主原创文章,未经博主允许不得转载。https://blog.csdn.net/m0_38043362/article/details/78064177
简单表达式 (simple expressions)
${...} 变量表达式
*{...} 选择变量表达式
#{...} 消息表达式
@{...} 链接url表达式
1
2
3
4
5
6
7
字面量
Text literals: 'one text' , 'Another one!' ,…文本
Number literals: 0 , 34 , 3.0 , 12.3 ,…数字
Boolean literals: true , false布尔
Null literal: null空
Literal tokens: one , sometext , main ,…文本字符
1
2
3
4
5
6
7
8
9
文本操作
字符串连接
|The name is ${name}| 字符串连接
算术运算
+ , - , * , / , % 二元运算符
- 负号(一元运算符)
1
2
3
布尔操作
and,or 二元操作符
!,not 非(一元操作符)
关系操作符
, < , >= , <= (gt , lt , ge , le) 比大小
== , != (eq, ne) 比等值
条件判断
(if) ? (then) if-then
(if) ? (then) : (else) if-then-else
1
2
3
<!-- 条件判断 -->
1
2
3
4
条件表达式中的三个部分自身也可以是表达式,也可以是变量(${...}, *{...}),
消息(#{...}), URL (@{...}) 或字面量 ('...')
条件表达式也可以使用括号来嵌套:
1
2
3
<!-- 条件判断 -->
1
2
3
else表达式也可以省略,当条件为false时,会返回null:
1
<!-- 条件判断 -->
1
2
3
(value) ?: (defaultvalue) Default
只有第一个返回null时第二个表达式才会运算
1
2
表达式内置工具对象
#dates 与java.util.Date对象的方法对应,格式化、日期组件抽取等等#calendars 类似#dates,与java.util.Calendar对象对应#numbers格式化数字对象的工具方法#strings 与java.lang.String对应的工具方法:contains、startsWith、prepending/appending等等#objects 用于对象的工具方法#bools 用于布尔运算的工具方法#arrays 用于数组的工具方法#lists 用于列表的工具方法#sets 用于set的工具方法#maps 用于map的工具方法#aggregates 用于创建数组或集合的聚合的工具方法#messages 用于在变量表达式内部获取外化消息的工具方法,与#{…}语法获取的方式相同#ids 用于处理可能重复出现(例如,作为遍历的结果)的id属性的工具方法
1
2
3
4
5
6
7
8
9
10
11
12
13
表达式内置基本对象
#ctx : the context object.
#vars: the context variables.
#locale : the context locale.
#request : (only in Web Contexts) the HttpServletRequest object.
(在web环境下才可用)
#response : (only in Web Contexts) the HttpServletResponse object.
(在web环境下才可用)
#session : (only in Web Contexts) the HttpSession object.
(在web环境下才可用)
#servletContext : (only in Web Contexts) the ServletContext object.
(在web环境下才可用)
1
2
3
4
5
6
7
8
9
10
11
12
选择表达式(*{xx})
<!-- 选择表达式 --><!-- 等同于 -->
1
2
3
4
5
6
url连接@{…}
使用这种方式的好处就是可以自动将()内的中文参数自动进行URL编码
<!-- URL --><!-- href="/demo/page?param=%E6%B5%8B%E8%AF%95%E7%94%A8%E6%88%B7%EF%BC%81" -->demo page<!-- href="/" -->demo page<!-- href="/demo/page?param=%E6%B5%8B%E8%AF%95%E7%94%A8%E6%88%B7%EF%BC%81" -->demo page
1
2
3
4
5
6
7
变量表达式
变量表达式可以解析OGNL语法。详尽的语法信息可以访问官网:
http://commons.apache.org/ognl/
字面值替换
<!--
替换字面值
<p th:text="|Welcome to our application, ${custUser.nickname}!|">你好</p>
等同于
<p th:text="'Welcome to our application, ' + ${custUser.nickname} + '!'">你好</p>
-->你好
1
2
3
4
5
6
7
数字运算
<!-- 数字运算 -->
1
2
message表达式#{..}
从配置文件中取配置的信息
可以通过该表达式,实现国际化信息
<!-- 国际化,将submit按钮的message从messages_zh_CN.properties(默认)中获取 -->
1
2
3
4
5
6
7
属性设置
th:attr 为万能属性设置,内容为key value 形式多个属性用,号分隔
1
2
3
4
5
6
指定单个属性
1
2
支持的属性
参见官方文档
属性介绍
<!--
追加属性 和 前置追加
email is :12222222@xx.com
12222222@xx.com is email.
--><!-- 数据回显时,使用这个方法来选择 -->123
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
循环
可以处理如下对象的遍历
java.util.Iterable
java.util.Enumeration
java.util.Iterator
java.util.Map
any array
<!-- 循环标签 -->NAMEPRICEIN STOCK
+' '+ elementStat.count +' '+ elementStat.size
+' '+ elementStat.current +' '+ elementStat.even
+' '+ elementStat.odd +' '+ elementStat.first
+' '+ elementStat.last}">OnionsNAMEPRICEIN STOCK
+' '+ iterStat.count +' '+ iterStat.size
+' '+ iterStat.current +' '+ iterStat.even
+' '+ iterStat.odd +' '+ iterStat.first
+' '+ iterStat.last}">Onions<!--
th:if 条件判断,相当于if(!(xx==xx)){}
th:unless 与th:if正好相反
-->角标不为1角标为1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
循环的状态属性 默认从element+Stat取值 或者自己制定 前缀+Stat
index 角标从0开始
count 从1开始
size 集合大小
current 当前元素
even/odd 奇偶
first(boolean)
last(boolean)
switch语句
<!-- switch标签 -->User is an administratorhello my text!default
1
2
3
4
5
6
7
使用th:case=”*” 相当于default:
swich(x){case1:break;case2:break;default:}
1
2
3
4
5
6
7
8
Fragments片段表达式~{…} 3.0以后的版本支持
1.~{templatename::selector}
可以利用此功能方便地将重复的片段抽取出来
如footer header
1
2
3
4
<!-- 代码片段定义在fragment.html中 --><!-- <div th:fragment="copy">
© 2011 The Good Thymes Virtual Grocery
</div> --><!-- 代码片段使用其他页面均可使用该表达式引入 --><!-- 替换掉当前外层div标签 --><!-- 这么写也可以 -->
1
2
3
4
5
6
7
8
9
10
11
12
2.~{templatename}
包含指定模板中所有内容
3.~{::selector}" or "~{this::selector}"
自己页面内的模板可以省略掉模板名称
1
2
3
4
5
以上的表达式都支持在selector中支持支持的所有表达式
1
也可以不使用 th:fragment来定义片段
© 2011 The Good Thymes Virtual Grocery
1
2
3
4
5
可以指定参数的Fragments片段
<!-- 指定参数的片段 --><!-- <div th:fragment="frag (onevar,twovar)">
<p th:text="${onevar} + ' - ' + ${twovar}">...</p>
</div> -->
1
2
3
4
5
6
7
Fragments片段支持嵌套
<!-- 指定要嵌套的片段 --><!-- 片段嵌套 -->
no operation
<!-- 片段嵌套 --><!-- 不指定参数 -->1
2
3
4
5
6
7
8
9
10
11
12
这种不能放到一个页面里,否则会解析不到${otherfrag}
也可以使用表达式判断条件决定是否引入
定义局部变量
<!-- 定义局部变量 -->
The name of the first person isJulius Caesar.
1
2
3
4
5
6
行内表达式
<!-- 行内表达式 -->
今日阳光明媚,[[${custUser.nickname}]]
<!-- 与下面的等价 -->今日阳光明媚,
1
2
3
4
格式化日期等${{user.lastAccessDate}}
...
1
使用${{xxx}}该表达式,解析器会根据符合 xxx类型–>String的转换器,进行转换
例如:
@ConfigurationpublicclassThymeleafConfigextendsWebMvcConfigurerAdapterimplementsApplicationContextAware{....@OverridepublicvoidaddFormatters(finalFormatterRegistry registry) {super.addFormatters(registry); registry.addFormatter(dateFormatter()); }@BeanpublicDateFormatterdateFormatter() {returnnewMyDateFormatter(); } class MyDateFormatter extends DateFormatter{@OverridepublicStringprint(Date date, Locale locale) {returnnewSimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); } }}