目录
Thymeleaf是一款用于渲染XML/HTML5内容的模板引擎,类似JSP。它可以轻易的与SpringMVC等Web框架进行集成作为Web应用的模板引擎。在SpringBoot中推荐使用Thymeleaf编写动态页面。
Thymeleaf最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用。
Thymeleaf在有网络和无网络的环境下皆可运行,它即可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。没有数据时,Thymeleaf的模板可以静态地运行;当有数据返回到页面时,Thymeleaf标签会动态地替换掉静态内容,使页面动态显示。
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-thymeleafartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
一定要注意templates的html文件不能直接访问,需要编写controller跳转到页面中
html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>thymeleaf入门title> head> <body> <h2 th:text="${name}">h2> body> html>
- @Controller
- public class PageController {
- // 页面跳转
- @GetMapping("/show")
- public String showPage(Model model){
- model.addAttribute("name","Hello Thymeleaf");
- return "index";
- }
- }
th:text
作用:将model的值作为内容放入标签中。
th:value
作用:将model的值放入input标签的value属性中
- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>thymeleaf入门title>
- head>
- <body>
- <h1>name=<span th:text="${name}">span>h1>
- <input th:value="${name}">
- body>
- html>
Thymeleaf提供了一些内置对象可以操作数据,内置对象可直接在模板中使用,这些对象是以#引用的,操作字符串的内置对象为strings。
方法 说明 ${#strings.isEmpty(key)} 判断字符串是否为空,如果为空返回true,否则返回false ${#strings.contains(msg,'T')} 判断字符串是否包含指定的子串,如果包含返回true,否则返回false ${#strings.startsWith(msg,'a')} 判断当前字符串是否以子串开头,如果是返回true,否则返回false ${#strings.endsWith(msg,'a')} 判断当前字符串是否以子串结尾,如果是返回true,否则返回false ${#strings.length(msg)} 返回字符串的长度 ${#strings.indexOf(msg,'h')} 查找子串的位置,并返回该子串的下标,如果没找到则返回-1 ${#strings.substring(msg,2,5)} 截取子串,用法与JDK的subString方法相同 ${#strings.toUpperCase(msg)} 字符串转大写 ${#strings.toLowerCase(msg)} 字符串转小写
- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>thymeleaf入门title>
- head>
- <body>
- <span th:text="${#strings.length(name)}">span>
- <span th:text="${#strings.startsWith(name,'n')}">span>
- body>
- html>
操作时间的内置对象为dates
方法 说明 ${#dates.format(key)} 格式化日期,默认的以浏览器默认语言为格式化标准 ${#dates.format(key,'yyyy/MM/dd')} 按照自定义的格式做日期转换 ${#dates.year(key)} 取年 ${#dates.month(key)} 取月 ${#dates.day(key)} 取日
添加数据 model.addAttribute("date",new Date(130,01,01));
html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>thymeleaf入门title> head> <body> <span th:text="${#dates.format(date)}">span> <span th:text="${#dates.format(date,'yyyy/MM/dd')}">span> <span th:text="${#dates.year(date)}">span> <span th:text="${#dates.month(date)}">span> body> html>
th:if 用于条件判断
th:switch/th:case th:switch/th:case与Java中的switch语句等效。
th:case="*"表示Java中switch的default,即没有case的值为true时显示th:case="*"的内容。
添加数据 model.addAttribute("age",3);
html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>thymeleaf入门title> head> <body> <span th:if="${age}==1">我是1span> <span th:if="${age}==2">我是2span> <span th:if="${age}==3">我是3span> body> html>
- html>
- <html lang="en" xmlns:th="http://www.thymeleaf.org">
- <head>
- <meta charset="UTF-8">
- <title>thymeleaf入门title>
- head>
- <body>
- <div th:switch="${age}">
- <span th:case="1">我是1span>
- <span th:case="2">我是2span>
- <span th:case="3">我是3span>
- <span th:case="4">我是4span>
- <span th:case="*">我是不知道span>
- div>
- body>
- html>
th:each 迭代器,用于循环迭代集合
@GetMapping("/c1") public String t1(Model model){ Listusers=new ArrayList<>(); Users users1=new Users("2","pet",54); Users users2=new Users("18","ioi",7); Users users3=new Users("223","ppp",65); users.add(users1); users.add(users2); users.add(users3); model.addAttribute("li",users); return "index"; }
<body> <table border="1" width="50%"> <tr> <th>idth> <th>nameth> <th>ageth> tr> <tr th:each="u:${li}"> <td th:text="${u.id}">td> <td th:text="${u.name}">td> <td th:text="${u.age}">td> tr> table> body>
thymeleaf将遍历的状态变量封装到一个对象中,通过该对象的属性可以获取状态变量:
状态变量 含义 index 当前迭代器的索引,从0开始 count 当前迭代对象的计数,从1开始 size 被迭代对象的长度 odd/even 布尔值,当前循环是否是偶数/奇数,从0开始 first 布尔值,当前循环的是否是第一条,如果是返回true,否则返回false last 布尔值,当前循环的是否是最后一条,如果是则返回true,否则返回false
<tr th:each="user,status : ${li}"> <td th:text="${user.id}">td> <td th:text="${user.name}">td> <td th:text="${user.age}">td> <td th:text="${status.index}">td> <td th:text="${status.count}">td> <td th:text="${status.size}">td> <td th:text="${status.odd}">td> <td th:text="${status.even}">td> <td th:text="${status.first}">td> <td th:text="${status.last}">td> tr>
遍历Map出来的每一项是键值对,key获取键,value获取值
@GetMapping("/c1") public String t1(Model model){ Mapmap=new HashMap<>(); map.put("u1",new Users("16","张三",90)); map.put("u2",new Users("90","李四",12)); map.put("u4",new Users("1","王一",16)); model.addAttribute("us",map); return "index"; }
<body> <table border="1" width="50%"> <tr> <th>键th> <th>idth> <th>nameth> <th>ageth> tr> <tr th:each="u:${us}"> <th th:text="${u.key}">th> <th th:text="${u.value.id}">th> <th th:text="${u.value.name}">th> <th th:text="${u.value.age}">th> tr> table> body>
- @GetMapping("/c1")
- public String t1(HttpServletRequest request, HttpSession session){
- request.setAttribute("q1","我是request数据");
- session.setAttribute("s1","我绝对是session");
- ServletContext servletContext=session.getServletContext();
- servletContext.setAttribute("c1","我真的是context'数据");
- return "index";
- }
- <body>
- request1=<span th:text="${#request.getAttribute('q1')}">span>
- request2=<span th:text="${#httpServletRequest.getAttribute('q1')}">span>
- session=<span th:text="${session.s1}">span>
- session1=<span th:text="${#httpSession.getAttribute('s1')}">span>
- context1=<span th:text="${application.c1}">span>
- context2=<span th:text="${#servletContext.getAttribute('c1')}">span>
- body>
在Thymeleaf中路径的写法为@{路径}
- <a th:href="@{show2?id=1&name=gq}">静态参数一a>
- <a th:href="@{show2(id=2,name=gq)}">静态参数二a>
- <a th:href="@{'show2?id='+${id}+'&name='+${name}}">动态参数一a>
- <a th:href="@{show2(id=${id},name=${name})}">动态参数二a>