Thymeleaf通过标准变量表达式完成数据的展示和处理
- 标准变量表达式必须依赖标签,不能独立使用。
- 标准变量表达式一般在开始标签中,以 th开头。
- 语法为: <tag th:***="${key}" ></tag>
- 表达式中可以通过${}取出域中的值并放入标签的指定位置。
- ${}在这里不能单独使用,必须在 th:后面的双引号里使用。
为了有提示,修改html页面中<html>标签为:
<html lang="en" xmlns:th="http://www.thymeleaf.org" >
目录
1、th:text属性
向HTML标签内部输出信息。
(1)index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" >
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    this is index page
    <!--向span双标签内部添加文本-->
    <span th:text="pageMessage"></span> <br/>
    <!--从域中根据参数名取出参数值放在双标签中-->
    <span th:text="${msg}"></span>      <br/>
</body>
</html>(2)controller层
@Controller
public class ThymeleafController {
    @RequestMapping("showIndex")
    public String  showIndex(Map<String,Object> map){
        map.put("msg", "testMessage");
        return "index";
    }
}
(3)响应页面

2、th:value属性
表单元素,设置HTML标签中表单元素value属性时使用。
(1)index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org" >
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    this is index page
    <!--向span双标签内部添加文本-->
    <span th:text="pageMessage"></span> <br/>
    <!--从域中根据参数名取出参数值放在双标签中-->
    <span th:text="${msg}"></span>      <br/>
    <!--向input标签中的value属性赋值-->
    <input type="text"  th:value="pageMessage"/>
    <!--从域中根据参数名取出参数值 向input标签中的value属性赋值-->
    <input type="text"  th:value="${msg}"/>
</body>
</html>(2)controller层
@Controller
public class ThymeleafController {
    @RequestMapping("showIndex")
    public String  showIndex(Map<String,Object> map){
        map.put("msg", "testMessage");
        return "index";
    }
}
(3)响应页面

3、th:if属性
(1)showEmp.html
<span th:if="${emp}!=null"></span>判断emp对象是否为空
<span th:if="${empList}!=null"> <span th:if="${empList.size()}!=0"></span></spqn>
先判断empList集合是否为空,再判断empList集合的长度是否为0.
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        #empTable{
            width: 80%;
            border: 1px solid blue;
            margin: 0px auto;
        }
        #empTable th,td{
            border: 1px solid green;
            text-align: center;
        }
    </style>
</head>
<body>
展示单个员工信息:
<span th:if="${emp}!=null">
    工号:<span th:text="${emp.empno}"></span><br/>
    姓名:<span th:text="${emp.ename}"></span><br/>
    职务:<span th:text="${emp.job}"></span><br/>
    上级:<span th:text="${emp.mgr}"></span><br/>
    入职日期:<span th:text="${emp.hiredate}"></span><br/>
    工资:<span th:text="${emp.sal}"></span><br/>
    补助:<span th:text="${emp.comm}"></span><br/>
    部门号:<span th:text="${emp.deptno}"></span><br/>
</span>
<hr/>
<span  th:if="${empList}!=null">
    <span  th:if="${empList.size()}!=0">
        工号:<span th:text="${empList[0].empno}"></span><br/>
        姓名:<span th:text="${empList[0].ename}"></span><br/>
        职务:<span th:text="${empList[0].job}"></span><br/>
        上级:<span th:text="${empList[0].mgr}"></span><br/>
        入职日期:<span th:text="${empList[0].hiredate}"></span><br/>
        工资:<span th:text="${empList[0].sal}"></span><br/>
        补助:<span th:text="${empList[0].comm}"></span><br/>
        部门号:<span th:text="${empList[0].deptno}"></span><br/>
    </span>
</span>
</body>
</html>(2)controller层
 @Autowired
    private EmpService empService;
    @RequestMapping("/showEmp")
    public String showEmp(Map<String, Object> map) {
        List<Emp> empList = empService.findAll();
        map.put("empList", empList);
        map.put("emp", empList.get(0));
        return "showEmp";
    }(3)响应页面

4、th:each属性
th:each="u,i :${list}" 其中u为迭代遍历,i表示迭代状态,i可以使用以下状态
- index:当前迭代器的索引从0开始。
- count:当前迭代对象的计数从1开始。
- size:被迭代对象的长度。
- even/odd:布尔值,当前循环是否是奇数/偶数从0开始。
- first:布尔值,当前循环的是否是第一条,如果是返回true,否则返回false。
- last:布尔值,当前循环的是否是最后一条,如果是则返回true,否则返回false。
(1)showEmp.html
<tr th:each="emp,i:${empList}"> empList集合中的单个对象赋给emp,
                                                      相当于for(Emp emp:empList);
         <td th:text="${i.index}"></td>
         <td th:text="${i.count}"></td>
         <td th:text="${i.size}"></td>
         <td th:text="${i.odd}"></td>
         <td th:text="${i.even}"></td>
         <td th:text="${i.first}"></td>
         <td th:text="${i.last}"></td>
         <td th:text="${emp.empno}"></td>
         <td th:text="${emp.ename}"></td>
         <td th:text="${emp.job}"></td>
         <td th:text="${emp.mgr}"></td>
         <td th:text="${emp.hiredate}"></td>
         <td th:text="${emp.sal}"></td>
         <td th:text="${emp.comm}"></td>
         <td th:text="${emp.deptno}"></td>
     </tr>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        #empTable{
            width: 80%;
            border: 1px solid blue;
            margin: 0px auto;
        }
        #empTable th,td{
            border: 1px solid green;
            text-align: center;
        }
    </style>
</head>
<body>
展示单个员工信息:
<span th:if="${emp}!=null">
    工号:<span th:text="${emp.empno}"></span><br/>
    姓名:<span th:text="${emp.ename}"></span><br/>
    职务:<span th:text="${emp.job}"></span><br/>
    上级:<span th:text="${emp.mgr}"></span><br/>
    入职日期:<span th:text="${emp.hiredate}"></span><br/>
    工资:<span th:text="${emp.sal}"></span><br/>
    补助:<span th:text="${emp.comm}"></span><br/>
    部门号:<span th:text="${emp.deptno}"></span><br/>
</span>
<hr/>
<span  th:if="${empList}!=null">
    <span  th:if="${empList.size()}!=0">
        工号:<span th:text="${empList[0].empno}"></span><br/>
        姓名:<span th:text="${empList[0].ename}"></span><br/>
        职务:<span th:text="${empList[0].job}"></span><br/>
        上级:<span th:text="${empList[0].mgr}"></span><br/>
        入职日期:<span th:text="${empList[0].hiredate}"></span><br/>
        工资:<span th:text="${empList[0].sal}"></span><br/>
        补助:<span th:text="${empList[0].comm}"></span><br/>
        部门号:<span th:text="${empList[0].deptno}"></span><br/>
    </span>
</span>
<table  id="empTable" cellpadding="0px" cellspacing="0px">
    <tr>
        <th>索引</th>
        <th>序号</th>
        <th>总人数</th>
        <th>偶数索引?</th>
        <th>奇数索引?</th>
        <th>第一?</th>
        <th>最后?</th>
        <th>工号</th>
        <th>姓名</th>
        <th>职务</th>
        <th>上级</th>
        <th>入职日期</th>
        <th>工资</th>
        <th>补助</th>
        <th>部门号</th>
    </tr>
    <tr th:each="emp,i:${empList}">
        <td th:text="${i.index}"></td>
        <td th:text="${i.count}"></td>
        <td th:text="${i.size}"></td>
        <td th:text="${i.odd}"></td>
        <td th:text="${i.even}"></td>
        <td th:text="${i.first}"></td>
        <td th:text="${i.last}"></td>
        <td th:text="${emp.empno}"></td>
        <td th:text="${emp.ename}"></td>
        <td th:text="${emp.job}"></td>
        <td th:text="${emp.mgr}"></td>
        <td th:text="${emp.hiredate}"></td>
        <td th:text="${emp.sal}"></td>
        <td th:text="${emp.comm}"></td>
        <td th:text="${emp.deptno}"></td>
    </tr>
    
</table>
</body>
</html>(2)controller层
@Controller
public class ThymeleafController {
    @Autowired
    private EmpService empService;
    @RequestMapping("/showEmp")
    public String showEmp(Map<String, Object> map) {
        List<Emp> empList = empService.findAll();
        map.put("empList", empList);
        map.put("emp", empList.get(0));
        return "showEmp";
    }(3)响应页面

5、标准变量表达式支持的运算符
(1)算数运算符:
算术运算:+ , - , * , / , %
<span th:text="1+1"></span>              //2
<span th:text="'1'+1"></span>            //11
<span th:text="${emp.empno}+1"></span>   //7370   其中emp.empno==7369
<span th:text="${emp.empno+1}"></span>   //7370   其中emp.empno==7369(2)关系运算符:
1 gt:     great than(大于)>
2 ge:    great equal(大于等于)>=
3 eq:    equal(等于)==
4 lt:    less than(小于)<
5 le:    less equal(小于等于)<=
6 ne:    not equal(不等于)!= //emp.sal==800  emp.deptno==20
<div th:text="${emp.sal ge 800}"></div>                                //true
<div th:text="${emp.sal } ge 800"></div>                               //true
<div th:text="${emp.sal ge 800} and ${emp.deptno eq 20}"></div>        //true
<div th:text="(${emp.sal }ge 800) or (${emp.deptno } ne 20)"></div>    //true
<div th:text="${emp.sal ge 800 or emp.deptno ne 20 }"></div>           //true(3)逻辑运算符
&&或and:表示并且
||或or :表示或者<div th:text="1>0 and 2<3"></div>        //true
<div th:text="1>0 and 2>3"></div>        //false
<div th:text="1>0 or 2<3"></div>         //true
<div th:text="1>0 or 2>3"></div>         //true
在早期的thymeleaf模板引擎框架中 逻辑运算符要写在${}的外边。
(4)三目运算符
<tr th:each="emp,i:${empList}" th:class="${i.odd}?a:b">
6、对空值作出处理
(1)showEmp.html
<tr th:each="emp,i:${empList}" th:class="${i.odd}?a:b">
        <td th:text="${i.index}"></td>
        <td th:text="${i.count}"></td>
        <td th:text="${i.size}"></td>
        <td th:text="${i.odd}"></td>
        <td th:text="${i.even}"></td>
        <td th:text="${i.first}"></td>
        <td th:text="${i.last}"></td>
        <td th:text="${emp.empno}"></td>
        <td th:text="${emp.ename}"></td>
        <td th:text="${emp.job}"></td>
        <td th:text="${emp.mgr} eq null ?老板:${emp.mgr}"></td>
        <td th:text="${emp.hiredate}"></td>
        <td th:text="${emp.sal}"></td>
        <td th:text="${emp.comm} eq null ?0:${emp.comm}"></td>
        <td th:text="${emp.deptno}"></td>
    </tr>(2)controller层
@Controller
public class ThymeleafController {
    @Autowired
    private EmpService empService;
    @RequestMapping("/showEmp")
    public String showEmp(Map<String, Object> map) {
        List<Emp> empList = empService.findAll();
        map.put("empList", empList);
        map.put("emp", empList.get(0));
        return "showEmp";
    }(3)响应页面

7、 th:href属性
(1)showEmp.html
<a th:href="@{/removeEmp(empno=${emp.empno},ename=${emp.ename})}">删除</a>
  <tr th:each="emp,i:${empList}" th:class="${i.odd}?a:b">
        <td th:text="${i.index}"></td>
        <td th:text="${i.count}"></td>
        <td th:text="${i.size}"></td>
        <td th:text="${i.odd}"></td>
        <td th:text="${i.even}"></td>
        <td th:text="${i.first}"></td>
        <td th:text="${i.last}"></td>
        <td th:text="${emp.empno}"></td>
        <td th:text="${emp.ename}"></td>
        <td th:text="${emp.job}"></td>
        <td th:text="${emp.mgr} eq null ?老板:${emp.mgr}"></td>
        <td th:text="${emp.hiredate}"></td>
        <td th:text="${emp.sal}"></td>
        <td th:text="${emp.comm} eq null ?0:${emp.comm}"></td>
        <td th:text="${emp.deptno}"></td>
        <td>
            <a th:href="@{/removeEmp(empno=${emp.empno},ename=${emp.ename})}">删除</a>
        </td>
    </tr>(2)controller层
return "redirect:showAllEmp":重定向,重新走@RequestMapping("/showAllEmp")注解的方法。
return "showEmp":直接走showEmp.html模板。
@Controller
public class ThymeleafController {
    @Autowired
    private EmpService empService;
    @RequestMapping("/showAllEmp")
    public String showEmp(Map<String, Object> map) {
        List<Emp> empList = empService.findAll();
        map.put("empList", empList);
        map.put("emp", empList.get(0));
        return "showEmp";
    }
    @RequestMapping("/removeEmp")
    public String removeEmp(Integer empno,String ename){
        boolean success =empService.removeEmp(empno,ename);
        return "redirect:showAllEmp";
    }
}(3) service层
public interface EmpService {
    List<Emp> findAll();
    boolean removeEmp(Integer empno, String ename);
}@Service
public class EmpServiceImpl implements EmpService{
    @Autowired
    private EmpMapper empMapper;
    @Override
    public List<Emp> findAll() {
        return empMapper.findAll();
    }
    @Override
    public boolean removeEmp(Integer empno, String ename) {
        return empMapper.removeEmp(empno,ename)>1;
    }
}(4)mapper层
@Mapper
public interface EmpMapper {
    List<Emp> findAll();
    int removeEmp(Integer empno, String ename);
}(5)mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.msb.mapper.EmpMapper">
    <select id="findAll" resultType="emp">
        select * from emp
    </select>
    <!--int removeEmp(Integer empno, String ename);-->
    <delete id="removeEmp">
        delete from emp where empno=#{param1} and ename=#{param2}
    </delete>
</mapper>(7)响应页面
点击删除后:删除第一个数据

<a th:href="@{/removeEmp(empno=${emp.empno},ename=${emp.ename})}">删除</a>
点击删除后,获取当前遍历对象的empno和ename,传给注解为@RequestMapping("/removeEmp")的方法,走removeEmp方法,然后走注解为@RequestMapping("/showAllEmp")的方法。
@RequestMapping("/showAllEmp")
     public String showEmp(Map<String, Object> map) {
         List<Emp> empList = empService.findAll();
         map.put("empList", empList);
         map.put("emp", empList.get(0));
         return "showEmp";
     }
     @RequestMapping("/removeEmp")
     public String removeEmp(Integer empno,String ename){
         boolean success =empService.removeEmp(empno,ename);
         return "redirect:showAllEmp";
     }
8、th:onclick属性
给元素绑定事件,单击事件并传递参数
 写法1:仅仅支持数字和布尔类型参数的传递,字符串不支持。
<a href="javascript:viod(0)"  th:onclick="'del('+${emp.empno}+')'">删除</a>写法2:支持数字和文本类型的参数传递。
<a href="javascript:void(0)" th:onclick="delEmp([[${emp.empno}]],[[${emp.ename}]])">删除</a>(1)showEmp.html
href="javascript:void(0)"相当于把href属性给去掉了。
<table  id="empTable" cellpadding="0px" cellspacing="0px">
    <tr>
        <th>索引</th>
        <th>序号</th>
        <th>总人数</th>
        <th>偶数索引?</th>
        <th>奇数索引?</th>
        <th>第一?</th>
        <th>最后?</th>
        <th>工号</th>
        <th>姓名</th>
        <th>职务</th>
        <th>上级</th>
        <th>入职日期</th>
        <th>工资</th>
        <th>补助</th>
        <th>部门号</th>
        <th>操作</th>
    </tr>
    <tr th:each="emp,i:${empList}" th:class="${i.odd}?a:b">
        <td th:text="${i.index}"></td>
        <td th:text="${i.count}"></td>
        <td th:text="${i.size}"></td>
        <td th:text="${i.odd}"></td>
        <td th:text="${i.even}"></td>
        <td th:text="${i.first}"></td>
        <td th:text="${i.last}"></td>
        <td th:text="${emp.empno}"></td>
        <td th:text="${emp.ename}"></td>
        <td th:text="${emp.job}"></td>
        <td th:text="${emp.mgr} eq null ?老板:${emp.mgr}"></td>
        <td th:text="${emp.hiredate}"></td>
        <td th:text="${emp.sal}"></td>
        <td th:text="${emp.comm} eq null ?0:${emp.comm}"></td>
        <td th:text="${emp.deptno}"></td>
        <td>
            <a href="javascript:void(0)" th:onclick="removeEmp([[${emp.empno}]],[[${emp.ename}]])">删除</a>
        </td>
    </tr>
    
</table>
<script>
    function removeEmp(empno,ename){
        var resulet =confirm("确定要删除编号为"+empno+"的"+ename);
        if(resulet){
            window.location.href="removeEmp?empno="+empno+"&ename="+ename;
        }
    }
</script>(2)controller层
@Controller
public class ThymeleafController {
    @Autowired
    private EmpService empService;
    @RequestMapping("/showAllEmp")
    public String showEmp(Map<String, Object> map) {
        List<Emp> empList = empService.findAll();
        map.put("empList", empList);
        map.put("emp", empList.get(0));
        return "showEmp";
    }
    @RequestMapping("/removeEmp")
    public String removeEmp(Integer empno,String ename){
        boolean success =empService.removeEmp(empno,ename);
        return "redirect:showAllEmp";
    }
}(3)响应页面











