${...} 变量表达式
*{...} 选择变量表达式
#{...} 消息表达式
@{...} 链接url表达式
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 ,…文本字符
|The name is ${name}| 字符串连接
+ , - , * , / , % 二元运算符
- 负号(一元运算符)
and,or 二元操作符
!,not 非(一元操作符)
, < , >= , <= (gt , lt , ge , le) 比大小
== , != (eq, ne) 比等值
(if) ? (then) if-then
(if) ? (then) : (else) if-then-else
<p th:text="${myText} eq 'hello my text!'?'equals':'not equals'">p>
<p th:text="${myText} eq 'hello my text!!!'?'equals':'not equals'">p>
条件表达式中的三个部分自身也可以是表达式,也可以是变量(${...}, *{...}),
消息(#{...}), URL (@{...}) 或字面量 ('...')
条件表达式也可以使用括号来嵌套:
<p th:text="${myText} eq ${myText}?(${myText} eq 'aa' ? 'aa' : ${myText}):'not equals'">p>
else表达式也可以省略,当条件为false时,会返回null:
<p th:text="${myText} eq 'aa' ? 'aa'">p>
(value) ?: (defaultvalue) Default
只有第一个返回null时第二个表达式才会运算
#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属性的工具方法
#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环境下才可用)
<div th:object="${custUser}">
<p th:text="*{nickname}">p>
<p th:text="${custUser.nickname}">p>
div>
使用这种方式的好处就是可以自动将()内的中文参数自动进行URL编码
<a th:href="@{/demo/page(param=${custUser.nickname})}">demo pagea>
<a th:href="@{/}">demo pagea>
<a href="page.html" th:href="@{/demo/page(param=${custUser.nickname})}">demo pagea>
变量表达式可以解析OGNL语法。详尽的语法信息可以访问官网:
http://commons.apache.org/ognl/
<p th:text="|Welcome to our application, ${custUser.nickname}!|">你好p>
<p th:text="(1+1*2/3) % 2">p>
从配置文件中取配置的信息
可以通过该表达式,实现国际化信息
<form action="page.html" th:attr="action=@{/demo/page}">
<fieldset>
<input type="text" name="email" />
<input type="submit" value="Subscribe!" th:attr="value=#{demo.myMsg}"/>
fieldset>
form>
th:attr 为万能属性设置,内容为key value 形式多个属性用,号分隔
<form action="subscribe.html" th:attr="action=@{/subscribe}">
<fieldset>
<input type="text" name="email" />
<input type="submit" value="Subscribe!" th:attr="value=#{subscribe.submit}"/>
fieldset>
form>
指定单个属性
<input type="submit" value="Subscribe!" th:value="#{subscribe.submit}"/>
<form action="subscribe.html" th:action="@{/subscribe}">
支持的属性
参见官方文档
<form action="page.html" th:attr="action=@{/demo/page}">
<fieldset>
<input type="text" name="th:attrappend" value="email is :" th:attrappend="value='[email protected]'"/>
<input type="text" name="th:attrprepend" value=" is email." th:attrprepend="value='[email protected]'"/>
<input type="submit" value="Subscribe!" th:attr="value=#{demo.myMsg}"/>
fieldset>
form>
<input type="checkbox" name="active" th:checked="${user.active}" />
<select name="select">
<option >1option>
<option th:selected="true">2option>
<option>3option>
select>
可以处理如下对象的遍历
java.util.Iterable
java.util.Enumeration
java.util.Iterator
java.util.Map
any array
<table>
<tr>
<th>NAMEth>
<th>PRICEth>
<th>IN STOCKth>
tr>
<tr th:each="element : ${myList}">
<td th:text="${element +' '+ elementStat.index
+' '+ elementStat.count +' '+ elementStat.size
+' '+ elementStat.current +' '+ elementStat.even
+' '+ elementStat.odd +' '+ elementStat.first
+' '+ elementStat.last}">Onionstd>
tr>
table>
<table>
<tr>
<th>NAMEth>
<th>PRICEth>
<th>IN STOCKth>
tr>
<tr th:each="element,iterStat : ${myList}">
<td th:text="${element +' '+ iterStat.index
+' '+ iterStat.count +' '+ iterStat.size
+' '+ iterStat.current +' '+ iterStat.even
+' '+ iterStat.odd +' '+ iterStat.first
+' '+ iterStat.last}">Onionstd>
<td th:if="${not (iterStat.index==1)}">角标不为1td>
<td th:unless="${not (iterStat.index==1)}">角标为1td>
tr>
table>
循环的状态属性 默认从element+Stat取值 或者自己制定 前缀+Stat
index 角标从0开始
count 从1开始
size 集合大小
current 当前元素
even/odd 奇偶
first(boolean)
last(boolean)
<div th:switch="${myText}">
<p th:case="'admin'">User is an administratorp>
<p th:case="'hello my text!'">hello my text!p>
<p th:case="*">defaultp>
div>
使用th:case=”*” 相当于default:
swich(x){
case 1:
break;
case 2:
break;
default:
}
1.~{templatename::selector}
可以利用此功能方便地将重复的片段抽取出来
如footer header
<div th:insert="~{fragment :: copy}">div>
<div th:insert="~{fragment :: copy}">div>
<div th:replace="~{fragment :: copy}">div>
<div th:replace="fragment :: copy">div>
2.~{templatename}
包含指定模板中所有内容
3.~{::selector}" or "~{this::selector}"
自己页面内的模板可以省略掉模板名称
以上的表达式都支持在selector中支持支持的所有表达式
<div th:insert="footer :: (${user.isAdmin}? #{footer.admin} : #{footer.normaluser})">div>
也可以不使用 th:fragment来定义片段
<div id="copy-section">
© 2011 The Good Thymes Virtual Grocery
div>
<div th:insert="~{this :: #copy-section}">div>
<div th:replace="::frag ('aaa','bbbb')">div>
<div th:fragment="frag2 (otherfrag)">
<div th:replace="${otherfrag}"><p>no operationp>div>
div>
<div th:replace="fragment :: frag2(~{::frag('嵌套','就是嵌套')})">div>
<div th:replace="fragment :: frag2(_)">div>
这种不能放到一个页面里,否则会解析不到${otherfrag}
也可以使用表达式判断条件决定是否引入
<div th:with="firstPer='aaa'">
<p>
The name of the first person is <span th:text="${firstPer}">Julius Caesarspan>.
p>
div>
<p>今日阳光明媚,[[${custUser.nickname}]]p>
<p>今日阳光明媚,<span th:text="${custUser.nickname}">span>p>
<td th:text="${{user.lastAccessDate}}">...td>
使用${{xxx}}该表达式,解析器会根据符合 xxx类型–>String的转换器,进行转换
例如:
@Configuration
public class ThymeleafConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
....
@Override
public void addFormatters(final FormatterRegistry registry) {
super.addFormatters(registry);
registry.addFormatter(dateFormatter());
}
@Bean
public DateFormatter dateFormatter() {
return new MyDateFormatter();
}
class MyDateFormatter extends DateFormatter{
@Override
public String print(Date date, Locale locale) {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
}
}
}