基本语法:${}中的表达式本质是OGNL
OGNL
OGNL:Object-Graph Navigation Language对象-图 导航语言
对象图
从根对象触发,通过特定的语法,逐层访问对象的各种属性。
OGNL语法
起点
在Thymeleaf环境下,${}中的表达式可以从下列元素开始:
- 访问属性域的起点
- 请求域属性名
- session
- application
- param
- 内置对象
- #request
- #session
- #lists
- #strings
属性访问语法
- 访问对象属性:使用getXxx()、setXxx()方法定义的属性
- 对象.属性名
- 访问List集合或数组
- 集合或数组[下标]
- 访问Map集合
- Map集合.key
- Map集合[‘key’]
基本语法:分支与迭代
分支
if和unless
让标记了th:if、th:unless的标签根据条件决定是否显示。
示例的实体类:
public class Employee { private Integer empId; private String empName; private Double empSalary;
示例的Servlet代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.创建ArrayList对象并填充 List<Employee> employeeList = new ArrayList<>(); employeeList.add(new Employee(1, "tom", 500.00)); employeeList.add(new Employee(2, "jerry", 600.00)); employeeList.add(new Employee(3, "harry", 700.00)); // 2.将集合数据存入请求域 request.setAttribute("employeeList", employeeList); // 3.调用父类方法渲染视图 super.processTemplate("list", request, response); }
示例的HTML代码:
<table> <tr> <th>员工编号</th> <th>员工姓名</th> <th>员工工资</th> </tr> <tr th:if="${#lists.isEmpty(employeeList)}"> <td colspan="3">抱歉!没有查询到你搜索的数据!</td> </tr> <tr th:if="${not #lists.isEmpty(employeeList)}"> <td colspan="3">有数据!</td> </tr> <tr th:unless="${#lists.isEmpty(employeeList)}"> <td colspan="3">有数据!</td> </tr> </table>
if配合not关键词和unless配合原表达式效果是一样的,看自己的喜好。
switch
<h3>测试switch</h3> <div th:switch="${user.memberLevel}"> <p th:case="level-1">银牌会员</p> <p th:case="level-2">金牌会员</p> <p th:case="level-3">白金会员</p> <p th:case="level-4">钻石会员</p> </div>
迭代
<h3>测试each</h3> <table> <thead> <tr> <th>员工编号</th> <th>员工姓名</th> <th>员工工资</th> </tr> </thead> <tbody th:if="${#lists.isEmpty(employeeList)}"> <tr> <td colspan="3">抱歉!没有查询到你搜索的数据!</td> </tr> </tbody> <tbody th:if="${not #lists.isEmpty(employeeList)}"> <!-- 遍历出来的每一个元素的名字 : ${要遍历的集合} --> <tr th:each="employee : ${employeeList}"> <td th:text="${employee.empId}">empId</td> <td th:text="${employee.empName}">empName</td> <td th:text="${employee.empSalary}">empSalary</td> </tr> </tbody> </table>
在迭代过程中,可以参考下面的说明使用迭代状态:
<h3>测试each</h3> <table> <thead> <tr> <th>员工编号</th> <th>员工姓名</th> <th>员工工资</th> <th>迭代状态</th> </tr> </thead> <tbody th:if="${#lists.isEmpty(employeeList)}"> <tr> <td colspan="3">抱歉!没有查询到你搜索的数据!</td> </tr> </tbody> <tbody th:if="${not #lists.isEmpty(employeeList)}"> <!-- 遍历出来的每一个元素的名字 : ${要遍历的集合} --> <tr th:each="employee,empStatus : ${employeeList}"> <td th:text="${employee.empId}">empId</td> <td th:text="${employee.empName}">empName</td> <td th:text="${employee.empSalary}">empSalary</td> <td th:text="${empStatus.count}">count</td> </tr> </tbody> </table>
基本语法:包含其他模板文件
应用场景
抽取各个页面的公共部分:
创建页面的代码片段
使用th:fragment来给这个片段命名:
<div th:fragment="header"> <p>被抽取出来的头部内容</p> </div>
包含到有需要的页面
语法 | 效果 |
th:insert | 把目标的代码片段整个插入到当前标签内部 |
th:replace | 用目标的代码替换当前标签 |
th:include | 把目标的代码片段去除最外层标签,然后再插入到当前标签内部 |
页面代码举例:
<!-- 代码片段所在页面的逻辑视图 :: 代码片段的名称 --> <div id="badBoy" th:insert="segment :: header"> div标签的原始内容 </div> <div id="worseBoy" th:replace="segment :: header"> div标签的原始内容 </div> <div id="worstBoy" th:include="segment :: header"> div标签的原始内容 </div> ``