Thymeleaf 是⼀个支持原生THML 文件的 Java 模版,可以实现前后端分离的交互方式,即视图与业务数据分开响应,它可以直接将服务端返回的数据生成 HTML 文件,同时也可以处理 XML、JavaScript、CSS 等格式。
Thymeleaf 最⼤的特点是既可以直接在浏览器打开(静态方式),也可以结合服务端将业务数据填充到HTML 之后动态生成的页面(动态方法),Spring Boot 支持 Thymeleaf,使用起来非常方便。
1、创建 Maven 工程,不需要创建 Web ⼯程,pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.southwindgroupId>
<artifactId>springbootthymeleafartifactId>
<version>1.0-SNAPSHOTversion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.2.4.RELEASEversion>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>
dependencies>
project>
2、application.yml
spring:
thymeleaf:
prefix: classpath:/templates/ #模版路径
suffix: .html #模版后缀
servlet:
content-type: text/html #设置 Content-type
encoding: UTF-8 #编码⽅式
mode: HTML5 #校验 H5 格式
cache: false #关闭缓存,在开发过程中可以⽴即看到⻚⾯修改的结果
3、创建 Handler
package com.southwind.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@GetMapping("/index")
public ModelAndView index(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
modelAndView.addObject("name","张三");
return modelAndView;
}
}
4、启动类
package com.southwind;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
5、HTML
DOCTYPE html>
<html lang="en"> <html xmlns:th="http://www.thymeleaf.org"> <head>
<meta charset="UTF-8">
<title>Titletitle>
head> <body>
<h1>Indexh1>
<p th:text="${name}">Hello Worldp>
body>
html>
如果需要加载后台返回的业务数据,则需要在 HTML 页面中使用Thymeleaf 模版标签来完成。
1、需要引入模版标签
<html xmlns:th="http://www.thymeleaf.org">
2、通过特定的标签完成操作。
<p th:text="${name}">Hello Worldp>
Thymeleaf 模版标签不同于 JSTL,Thymeleaf 模版标签是直接嵌⼊到 HTML 原生标签内部。
th:text
th:text 用于文本的显示,将业务数据的值填充到 HTML 标签中。
th:if
th:if 用于条件判断,对业务数据的值进行判断,如果条件成里,则显示内容,否则不显示,具体的使用,如下所示。
@GetMapping("/if")
public ModelAndView ifTest(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("test");
modelAndView.addObject("score",90);
return modelAndView; }
<p th:if="${score>=90}">优秀p>
<p th:if="${score<90}">良好p>
th:unless
th:unless 也用作条件判断,逻辑与 th:if 恰好相反,如果条件不成里则显示,否则不显示。
@GetMapping("/unless")
public ModelAndView unlessTest(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("test");
modelAndView.addObject("score",90);
return modelAndView; }
<p th:unless="${score>=90}">优秀p>
<p th:unless="${score<90}">良好p>
th:switch th:case
th:switch th:case 两个结合起来使用,用作多条件等值判断,逻辑与 Java 中的 switch-case ⼀致,当switch 中的业务数据等于某个 case 时,就显示该 case 对应的内容。
@GetMapping("/switch")
public ModelAndView switchTest(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("test");
modelAndView.addObject("studentId",1);
return modelAndView; }
<div th:switch="${studentId}">
<p th:case="1">张三p>
<p th:case="2">李四p>
<p th:case="3">王五p>
div>
th:action
⽤来指定请求的 URL,相当于 form 表单中的 action 属性
<form th:action="@{/hello/login}" method="post">
<input type="submit"/>
form>
@GetMapping("/redirect/{url}")
public String redirect(@PathVariable("url") String url, Model model){
model.addAttribute("url","/hello/login");
return url; }
<form th:action="${url}" method="post">
<input type="submit"/>
form>
如果 action 的值直接写在 HTML 中,则需要使用 @{},如果是从后台传来的数据,则使用${}。
th:each
用来遍历集合
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
package com.southwind.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class User {
private Integer id;
private String name; }
@GetMapping("/each")
public ModelAndView each(){
List<User> list = Arrays.asList(
new User(1,"张三"),
new User(2,"李四"),
new User(3,"王五"));
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("test");
modelAndView.addObject("list",list);
return modelAndView; }
<table>
<tr>
<th>编号th>
<th>姓名th>
tr>
<tr th:each="user:${list}">
<td th:text="${user.id}">td>
<td th:text="${user.name}">td>
tr>
table>
th:value
用来给标签赋值
@GetMapping("/value")
public ModelAndView value(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("test");
modelAndView.addObject("value","Spring Boot");
return modelAndView; }
<input type="text" th:value="${value}"/>
th:src
用来引入静态资源,相当于 HTML 原生标签 img、script 的 src 属性。
图片,css,js,静态加载的 html 都需要放置在 resources/static 文件中
@GetMapping("/src")
public ModelAndView src(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("test");
modelAndView.addObject("src","/1.png");
return modelAndView; }
<img th:src="${src}"/>
如果 src 的值直接写在 HTML 中
<img th:src="@{/1.png}"/>
th:href
用作设置超链接的 href
@GetMapping("/href")
public ModelAndView href(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("test");
modelAndView.addObject("href","https://www.baidu.com");
return modelAndView; }
<a th:href="${href}">百度a>
th:selected
用作给 HTML 元素设置选中,条件成立则选中,否则不选中。
@GetMapping("/select")
public ModelAndView select(){
List<User> list = Arrays.asList(
new User(1,"张三"),
new User(2,"李四"),
new User(3,"王五")
);
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("test");
modelAndView.addObject("list",list);
modelAndView.addObject("name","李四");
return modelAndView; }
<select>
<option
th:each="user:${list}"
th:value="${user.id}"
th:text="${user.name}"
th:selected="${user.name == name}"
>option>
select>
结合 th:each 来使用,首先遍历 list 集合动态创建 option 元素,根据每次遍历出的 user.name 与业务数据中的 name 是否相等来决定是否要选择。
th:attr
给 HTML 标签的任意属性赋值
@GetMapping("/attr")
public ModelAndView attr(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("test");
modelAndView.addObject("attr","Spring Boot");
return modelAndView; }
<input th:attr="value=${attr}"/><br/>
<input th:value="${attr}"/>