说明:
Thymeleaf是页面模板,和FreeMarker 类似,替代JSP。
一、SpringBoot整合Thymeleaf:
1.导入依赖包,在工程pom.xml中:
<!-- 继承起步依赖spring-boot-starter-parent -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
</parent>
<dependencies>
<!-- 导入thymeleaf依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.暂时关闭thymeleaf缓存(实时显示效果),在工程resources/application.yml:
spring:
thymeleaf:
cache: false #设置不缓存,能看实时效果,正式环境改成true
3.其他配合类:
(1)实体类,用于传参的对象:
public class User implements Serializable {
public String name;
public int age;
public long birthday;
public String imgUrl;
//...以下为构造方法和set/get方法
}
(2)HTTP请求处理类,用于给页面传参:
@Controller
public class UserController {//处理HTTP请求
@RequestMapping("/getUserInfo")
public String getUserInfo(Model model) {
//给页面传对象
User user = new User("一个超长的名称", 18, new Date().getTime(), "http://");
model.addAttribute("user", user);
//给页面传列表
User user1 = new User("先生1", 19, new Date().getTime(), "http://");
User user2 = new User("先生2", 20, new Date().getTime(), "http://");
List<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
model.addAttribute("users", users);
//给页面传Map
Map<String, String> map = new HashMap<>();
map.put("key1", "值1");
model.addAttribute("map", map);
//给页面传html标签
model.addAttribute("htmlstr", "<p>HTML内容</p>");
return "userinfo"; //跳转到userinfo.html页
}
}
(3)编写Application类,用于启动服务:
@SpringBootApplication
public class Thymeleafpplication {
public static void main(String[] args) {
SpringApplication.run(Thymeleafpplication.class, args);
}
}
二、Thymeleaf使用:
1.在resources/templates下创建userinfo.html,用于编写Thymeleaf标签:
<!-- 一、导入thymeleaf标签库 -->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<!-- ...其他HTML自带标签 -->
<body>
<!-- 二、使用thymeleaf标签 -->
1.th:text使用,用于显示文本,${name}为传过来的参数:
格式:th:text="值"
例:
(1)获取并显示对象类型的数据:
<p th:text="${user.name}"></p>
(2)获取并显示map类型的数据:
<p th:text="${#maps.containsKey(map, 'key1')?map.key1:''}"></p><!-- 条件表达式,判断map中是否包含key1 -->
(3)格式化Date类型的数据:
<p th:text="${#dates.format(user.birthday, 'MM-dd')}"></p><!-- 格式化为 月-日 -->
(4)截取字符串,第1个参数为字符串,第2个参数为截取长度,必须大于3,设3显示...,设3以下报错
<p th:text="${#strings.abbreviate(user.name, 4)}"></p>
2.th:utext使用,会解析包含的html标签:
格式:th:utext="值"
例:
<p th:utext="${htmlstr}"></p>
3.th:action使用,用于请求接口:
格式:th:action="@{/请求路径名}"
例:
<form th:action="@{/getUserInfo}">
<input type="text" th:value="${user.name}"> <!-- 页面回显 -->
<button>请求getUserInfo接口</button>
</form>
4.th:each使用,循环获取列表中每个item的值:
格式:
th:each="item名称,状态名:${传过来的列表名}
${item名称} //item是对象时:${item名称.属性名}
(1)循环List数据:
<table>
<tr th:each="item,status:${users}">
<td th:text="${status.index}"></td> <!-- 当前position -->
<td th:text="${item.name}"></td> <!-- 取item的值 -->
</tr>
</table>
(2)遍历Map数据:
说明:#maps.containsKey为系统API。
<div th:each="item:${map}">
<span th:text="${item.key}"></span><!-- 取每个Key -->
<span th:text="${item.value}"></span><!-- 取每个值 -->
</div>
(3)用numbers.sequence创建数组:
格式:#numbers.sequence(第1个数, 最后1个数)
<div th:each="i:${#numbers.sequence(5, 10)}">
<span th:text="${i}"></span> <!-- 值为:5 6 7 8 9 10 -->
</div>
5.th:if和th:unless,条件判断:
(2)th:if,条件成立才执行:
格式:th:if="${条件表达式}"
<p th:if="${user.age>=17}">满足条件才显示的内容</p>
(2)th:unless,条件不成立才执行:
格式:th:unless="${条件表达式}"
<p th:unless="${user.age<17}">不满足条件才显示的内容</p>
6.th:fragment和th:include:
(1)th:fragment使用,在a_fra.html中定义模块:
格式:th:fragment="自定义模块名称"
<!--<span th:fragment="fra">待被导入的模块</span>-->
(2)th:include使用,userinfo.html导入a_fra.html页的模块:
格式:th:include="被导入的html文件名:自定义模块名"
<span th:include="a_fra::fra"></span> <!-- a_frag为html文件名, fra为模块名 -->
7.th:href使用,配置请求地址,可带参数:
格式:h:href="@{${url地址}(参数名='参数值')
<a th:href="@{${user.imgUrl}(key1='value1')}">点击跳到头像显示</a>
</body>
</html>
2.上面第6条(th:fragment和th:include标签)用到的a_fra.html(在resources/templates下创建):
<!DOCTYPE html>
<!-- 导入thymeleaf标签库 -->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
...
<body>
这是fragment页面
<span th:fragment="fra">这是fragment页面, 待被导入的模块</span>
</body>
</html>