thymleaf的使用(2)之th:*属性
thymleaf的使用
th:*属性
-
标准表达式通常需要搭配th:*属性来使用,这样Thymeleaf引擎才能正确的解析出表达式的结果。
-
使用文本
th:text,在标签中显示表达式的值的文本内容
<span th:text="${message}"></span>
使用外部化文本内容:
<span th:text="${message}">Welcome to BeiJing!</span>
当它作为静态文件直接允许时,浏览器会自动忽略不能识别的 th:text 标签,而显示 span 标签体的文本内容。
当它作为模板文件直接运行在服务器时, th:text 属性标签的值 会直接替换 span 里的文本内容。
th:utext
th:text和th:utext的区别在于:th:text默认会对含有HTML标签的内容进行转义。th:utext则不会对含有HTML标签的内容进行转义。
假设:后台String message = “Welcome to BeiJing!”
<span th:text="${message}"></span> th:text 结果:<b>Welcome to BeiJing!</b>
<span th:utext="${message}"></span> th:utext 结果:Welcome to BeiJing!
- 设置属性值
其中th:中的可以是HTML5支持的任意属性名称,甚至这些属性名称可以是自定义的
一般属性,属性值为正常类型
<a th:href="@{https://www.google.com.hk}">谷歌一下你能知道的更多</a>
<link rel="stylesheet" type="text/css" th:href="@{/css/easyui/themes/color.css}">
<script type="text/javascript" th:src="@{/js/weui.min.js}"></script>
<!-- <div item-id="1001">Welcome to BeiJing!</div> -->
<div th:item-id="${user.id}">Welcome to BeiJing!</div>
<div th:class='box'></div>
<input th:value='123' />
布尔属性, 如readonly、checked、selected等。它们若存在那就意味着值为true。
<input type="checkbox" name="rememberme" checked /> 记住我
<input type="radio" name="sex" value="male" checked> 男
<input type="radio" name="sex" value="female"> 女
<input type="text" name="appId" value="J123654" readonly>
<select>
<option selected>北京</option>
<option>上海</option>
<option>广州</option>
<option>深圳</option>
</select>
<input type="checkbox" name="rememberme" ch:checked="${rememberme}" /> 记住我
th:* - *,同时为标签的多个不同属性设置相同的一个值,可以使用th:-的语法
<img src="logo.png" th:alt-title="LOGO图片">
它相当于:
<img src='logo.png' th:alt="LOGO图片" th:title="LOGO图片" />
th:attrappend & th:attrprepend,可以将表达式的结果分别追加到指定的属性值之后和之前。
<!-- <button class="btn enable">购买</button> -->
<button class="btn" th:attrappend="class=${outOfStock} ? ' enable' : ' disable'">购买</button>
<!-- <button class="enable btn">购买</button> -->
<button class="btn" th:attrprepend="class=${outOfStock} ? 'enable ' : 'disable '">购买</button>
Thymeleaf还提供了两个常用的具体附加属性th:classappend=“…“和th:styleappend=””。它们分别用来代替th:attrappend=“class=…” 和th:attrappend=“style=…”。
<!-- <button class="btn enable">购买</button> -->
<button class="btn" th:classappend="${outOfStock} ? ' enable' : ' disable'">购买</button>
- 遍历
th:each=“自定义的元素变量名称 : ${集合变量名称}” :
<div>
<spn>你所在城市:</spn>
<select name="mycity">
<option th:each="city : ${cities}" th:text="${city.name}"></option>
</select>
</div>
th:each提供了一个用于跟踪迭代的状态变量,它包含以下几个属性
属性 | 类型 | 描述 |
---|---|---|
index | int | 当前迭代的索引,从0开始 |
count | int | 当前迭代的计数,从1开始 |
size | int | 集合中元素的总个数 |
current | int | 当前元素的对象 |
even | boolean | 当前迭代的计数是否是偶数 |
odd | boolean | 当前迭代的计数是否是奇数 |
first | boolean | 当前迭代的计数是否是奇数 |
last | boolean | 当前元素是否是集合的最后一个元素 |
状态变量的使用语法:th:each=“自定义的元素变量名称, 自定义的状态变量名称:${集合变量名称}”
<div>
<spn>所在城市:</spn>
<select name="mycity">
<option th:each="city, status : ${cities}" th:text="${city.name}" th:item-index="${status.count}">
</option>
</select>
</div>
管什么时候,Thymeleaf始终会为每个th:each创建一个状态变量,默认的状态变量名称就是自定义的元素变量名称后面加 Stat字符串组成
<div>
<spn>所在城市:</spn>
<select name="mycity">
<option th:each="city : ${cities}" th:text="${city.name}" th:item-index="${cityStat.count}">
</option>
</select>
</div>
- 条件判断
th:if,当表达式的评估结果为真时则显示内容,否则不显示
<a th:href="@{/user/order(uid=${user.id})}" th:if="${user != null}">我的订单</a>
简写
<a th:href="@{/user/order(uid=${user.id})}" th:if="${user}">我的订单</a>
当上述表达式的值不为null时
如果表达式的值是一个布尔类型,且值为true评估为真,否则为假;
如果表达式的值是一个数字类型,且值为非0评估为真,否则为假;
如果表达式的值是一个字符类型,且值为非0评估为真,否则为假;
如果表达式的值是一个字符串类型,且值为非“false”、“off”、“no”评估为真,否则为假;
如果表达式的值是一个字符串类型,且值为非“false”、“off”、“no”评估为真,否则为假;
当上述表达式的值为null时,评估为假。
th:unless,与th:if相反,当表达式的评估结果为假时则显示内容,否则不显示
<a th:href="@{/user/order(uid=${user.id})}" th:unless="${user == null}">我的订单</a>
th:switch,多路选择语句,它需要搭配th:case来使用
<div th:switch="${user.role}">
<p th:case="admin">管理员</p>
<p th:case="user">普通用户</p>
</div>
-模板布局
th:fragment,定义一段公用的代码片段
templates/footer.html文件下
<div th:fragment="base">© 2017 fanlychie</div>
使用th:fragment来定义一个代码片段时,它允许你指定一组参数
<font color='red'>th:fragment="fragmentname(arg1, arg2, ...)"</font>
<div th:fragment="crumbs(parent, child)">
<span th:text="|${parent} > ${child}|"></span>
</div>
<!-- 用户中心 > 我的订单 -->
<div th:replace="::crumbs('用户中心', '我的订单')"></div>
类选择器、ID选择器等定义一段公用的代码片段
templates/footer.html文件下
<div id="base">© 2017 fanlychie</div>
templates/welcome.html文件中引用footer.html中id=“base”片段的方式为:
<div th:insert="footer :: #base"></div>
th:insert,将公用的代码片段插入到标签体内
文件中引用footer.html中base代码片段的方式为
templates/welcome.html文件下
<div th:insert="~{footer :: base}"></div>
其中,~{ }是可选的,我们可以去掉这层的包裹
<div th:insert="footer :: base"></div>
如果footer.html与welcome.html不在同级目录,如templates/commons/footer.html
<div th:insert="@{commons/footer} :: base"></div>
th:replace,将公用的代码片段直接替换标签体内容
<!-- <div><div id="base">© 2017 fanlychie</div></div> -->
<div th:insert="footer :: base"></div>
<!-- <div id="base">© 2017 fanlychie</div> -->
<div th:replace="footer :: base"></div>
th:assert,断言,它可以同时指定多个表达式,每个表达式的结果评估值必须为true,否则它将会抛出一个异常。
语法:th:assert=“expression1, expression2…” :
<div th:replace="::crumbs(${parentMenuName}, ${childMenuName})" th:assert="${!#strings.isEmpty(parentMenuName), !#strings.isEmpty(childMenuName)}">
</div>
- 定义局部变量
th:with,可以定义局部变量
<p th:with="name='fanlychie'">
<span th:text="${name}"></span>
</p>
同时定义多个局部变量时,用英文,号分隔开
<p th:with="name=${user.name},age={user.age}">
</p>