[TOC]
简介(thymeleaf2)
支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式
thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示
表达式支持
信息(Messages)
信息使用表达式'#{}'的方式调用
主要用于做国际化
示例
例如在国际化文件(messages_zh_CN.properties)中的内容如下:
index.welcome=欢迎使用 {0} index.bye=再见!
使用TH调用的代码为:
<div class="content"> <h2>Messages</h2> <div> <label th:text="#{index.welcome('thymeleaf')}">welcome</label> </div> <div> <label th:text="#{index.bye}">?</label> </div> </div>
展示的结果为:
欢迎使用thymeleaf 再见!
变量(Variables)
Thymeleaf中使用OGNL表达式
也可以使用SpringEL表达式
在Web环境下 ${#httpServletRequest.getAttribute('')} ${#vars.get('xxx')} ${xxx} 都可以获取参数值
示例
例如在后台传入的数据为
PersionDto persion = new PersionDto(); persion.setName("张三"); persion.setIdNo("000001"); persion.setAge(25); view.addObject("persion", persion);
在TH中的的代码为:
<div class="content"> <h2>Variables</h2> <div> <label>姓名: </label><span th:text="${persion.name}">xxx</span> </div> <div> <label>Id号: </label><span th:text="${#vars.get('persion').idNo}"></span> </div> <div> <label>年龄: </label><span th:text="${#httpServletRequest.getAttribute('persion').age}">xxx</span> </div> <div> <label>当前语言: </label><span th:text="${#locale.language}">xxx</span> </div> <div> <label>参数type: </label><span th:text="${param.type==null?'not found':param.type[0]}">xxx</span> </div> </div>
展示的结果为:
姓名: 张三 Id号: 000001 年龄: 25 当前语言: zh 参数type: not found
内置对象
//-- 基本对象 #ctx : org.thymeleaf.context.IWebContext #locale : java.util.Locale #vars : org.thymeleaf.context.VariablesMap //-- Web参数 param : param.xxx size() isEmpty() containsKey('xxx') session : session.xxx size() isEmpty() containsKey('xxx') application : application.xxx size() isEmpty() containsKey('xxx') //-- Web对象 #httpServletRequest : javax.servlet.http.HttpServletRequest #httpSession : javax.servlet.http.HttpSession //-- Spring对象 #themes : provides the same features as the Spring spring:theme JSP tag. //-- Spring beans @beanName : ${@authService.getUserName()}
内置工具类
#dates : org.thymeleaf.expression.Dates #calendars : org.thymeleaf.expression.Calendars #numbers : org.thymeleaf.expression.Numbers #strings : org.thymeleaf.expression.Strings #objects : org.thymeleaf.expression.Objects #bools : rg.thymeleaf.expression.Bools #arrays : org.thymeleaf.expression.Arrays #lists : org.thymeleaf.expression.Lists #sets : org.thymeleaf.expression.Sets #maps : org.thymeleaf.expression.Maps #aggregates : org.thymeleaf.expression.Aggregates #messages : org.thymeleaf.expression.Messages #{xxx} #ids : org.thymeleaf.expression.Ids
选择表达式(selections)
用于简化参数表达式的使用
例如在后台传入的数据为
PersionDto persion = new PersionDto(); persion.setName("张三"); persion.setIdNo("000001"); persion.setAge(25); view.addObject("persion", persion);
在TH中的的代码为:
<div class="content"> <h2>Expressions on selections (asterisk syntax)</h2> <div th:object="${persion}"> <div> <label>姓名: </label><span th:text="*{name}">xxx</span> </div> <div> <label>Id号: </label><span th:text="*{idNo}"></span> </div> <div> <label>年龄: </label><span th:text="${persion.age}">xxx</span> </div> </div> </div>
展示的结果为:
姓名: 张三 Id号: 000001 年龄: 25
链接表达式(Link URLs)
使用@{}的格式表示 可以为有context-path的server自动增加context-path 参数可以使用(a=xx,b=yy)的格式表示参数
示例
例如当前应用server server.context-path=/sbemp 在TH中的的代码为:
<div class="content"> <h2>Link URLs</h2> <div> <div> <label>相对页面(Page-relative): </label><span th:text="@{detail.html(id='001')}"></span> </div> <div> <label>相对上下文(Context-relative): </label><span th:text="@{/welcome.html}"></span> </div> <div> <label>绝对服务(Server-relative): </label><span th:text="@{~/sbemp1/welcome.html}"></span> </div> <div> <label>相对协议(Protocol-relative): </label><span th:text="@{//code.jquery.com/jquery-2.0.3.min.js}"></span> </div> </div> </div>
展示的结果为:
相对页面(Page-relative): detail.html?id=001 相对上下文(Context-relative): /sbemp/welcome.html 绝对服务(Server-relative): /sbemp1/welcome.html 相对协议(Protocol-relative): //code.jquery.com/jquery-2.0.3.min.js
字面(Literals)
文本支持字符串拼接 数字支持基本运算: + , - , * , / , % 支持比较运算: gt ( > ), lt ( < ), ge ( >= ), le ( <= ), not ( ! ). Also eq ( == ),neq / ne ( != ). 支持条件(三目)运算 支持表达式预处理,即将表达式的值作为表达式使用
示例
例如后台传入的数据为
PersionDto persion = new PersionDto(); persion.setName("张三"); persion.setIdNo("000001"); persion.setAge(25); persion.setAdmin(true); persion.setMarks(null); persion.setExpression("${persion.admin}?'yes':'no'"); view.addObject("persion", persion);
在TH中的的代码为:
<div class="content"> <h2>Literals</h2> <div> <div> <label>文本: </label><span th:text="'@文本.@'"></span> </div> <div> <label>文本1: </label><span th:text="|hello${persion.name}|"></span> </div> <div> <label>文本2: </label><span th:text="'hello'+${persion.name}"></span> </div> <div> <label>文本3: </label><span th:text="'hello'+${persion.name}"></span> </div> <div> <label>文本3: </label><span th:text="__${persion.name}__"></span> </div> <div> <label>数字: </label><span th:text="2017+3"></span> </div> <div> <label>布尔: </label><span th:text="${persion.admin}==true"></span> </div> <div> <label>null: </label><span th:text="${persion.marks}==null"></span> </div> <div> <label>Expression: </label><span th:text="__${persion.expression}__"></span> </div> </div> </div>
展示的结果为:
文本: @文本.@ 文本1: hello张三 文本2: hello张三 文本3: hello张三 文本3: 张三 数字: 2020 布尔: true null: true Expression: yes
属性
支持大部分标签的属性
不支持的特殊标签使用attr标签进行设置 支持属性的前后拼接
示例
在TH中的的代码为:
<div class="content"> <h2>Setting Attribute Values</h2> <div> <div> <label class="lb" th:classappend="name">姓名: </label> <input th:id="|name_${persion.idNo}|" th:value="${persion.name}" /> <label class="lb" th:attrappend="class=' age'" th:attrprepend="class='second '">年龄: </label> <input th:attr="value=${persion.age}" /> </div> </div> </div>
编译之后的Html代码为:
<div class="content"> <h2>Setting Attribute Values</h2> <div> <div> <label class="lb name">姓名: </label> <input id="name_000001" value="张三" /> <label class="second lb age">年龄: </label> <input value="25" /> </div> </div> </div>
条件控制
循环(Iteration)
支持实现了java.util.Iterable接口的类 支持实现了java.util.Map接口的类 支持数组 循环时可使用状态对象,对象中包含index count size current even/odd first last等
示例
例如后台传入的数据为:
PersionDto p1 = new PersionDto(); p1.setName("name01"); p1.setIdNo("000001"); p1.setAge(21); PersionDto p2 = new PersionDto(); p2.setName("name02"); p2.setIdNo("000002"); p2.setAge(22); PersionDto p3 = new PersionDto(); p3.setName("name03"); p3.setIdNo("000003"); p3.setAge(23); List<PersionDto> persions = new ArrayList<PersionDto>(); persions.add(p1); persions.add(p2); persions.add(p3); view.addObject("persions", persions);
在TH中的的代码为:
<div class="content"> <h2>Iteration</h2> <div> <div> <ul> <li th:each="persion,stat : ${persions}"> <span th:text="${stat.index}"></span>-<span th:text="${persion.name}+'['+${stat.current.idNo}+']'"></span> </li> </ul> </div> </div> </div>
展示的结果为:
0-name01[000001] 1-name02[000002] 2-name03[000003]
判断(if/unless)
if属性可以用来控制标签的是否显示 unless = not if
示例
例如后台传入的数据为:
PersionDto persion = new PersionDto(); persion.setName("张三"); persion.setIdNo("000001"); persion.setAge(25); persion.setAdmin(true); view.addObject("persion", persion);
TH中的代码为:
<div class="content"> <h2>if unless</h2> <div> <div> <span th:if="${persion.admin}" th:text="'管理员'">Y</span> <span th:unless="${persion.admin}" th:text="'非管理员'">N</span> </div> </div> </div>
编译后的代码为:
<div class="content"> <h2>if unless</h2> <div> <div> <span>管理员</span> </div> </div> </div>
switch
switch 的case中通过 '*' 匹配 default
示例
例如后台传入的数据为:
PersionDto persion = new PersionDto(); persion.setName("张三"); persion.setIdNo("000001"); persion.setAge(25); persion.setAdmin(true); view.addObject("persion", persion);
TH中的代码为:
<div class="content"> <h2>Switch</h2> <div> <div th:switch="${persion.admin}"> <span th:case="true" th:text="'管理员'">Y</span> <span th:case="false" th:text="'非管理员'">N</span> </div> </div> </div>
编译后的代码为:
<div class="content"> <h2>Switch</h2> <div> <div> <span>管理员</span> </div> </div> </div>
模板布局
引用格式为 '模板路径 :: fragmet' 引用本文件中的代码时,模板名称为空 支持inclue 和 replace两种引用模式 模板引用时可以传参数 模板引用也可以通过标签ID的方式引入
示例
例如模板文件路径为 thymeleaf/footer.html
HT中的代码为:
<div class="content"> <h2>Template</h2> <div th:fragment="fra0"> <span th:text="'Hello Fragement'"></span> </div> <div> <div th:include=":: fra0"></div> <div class="frag" th:include="thymeleaf/footer :: fra1"></div> <div class="frag" th:replace="thymeleaf/footer :: fra1"></div> <div class="frag" th:include="thymeleaf/footer :: #fra2"></div> <div class="frag" th:include="thymeleaf/footer :: fra3('YYY YYY')"></div> </div> </div>
翻译后的代码为:
<div class="content"> <h2>Template</h2> <div> <span>Hello Fragement</span> </div> <div> <div> <span>Hello Fragement</span> </div> <div class="frag"> © 2017 XXX XXX </div> <div class="footer"> © 2017 XXX XXX </div> <div class="frag"> © 2018 XXX XXX </div> <div class="frag"> <span>© 2019 YYY YYY</span> </div> </div> </div>