在Spring Boot Web项目中,Thymeleaf是一种常用的模板引擎,它能够将服务器端的数据与HTML模板结合,生成动态网页。Thymeleaf的主要优势在于它能够在浏览器中直接查看模板效果,同时也能与Spring MVC完美集成。
首先,我们需要在项目中添加Thymeleaf的依赖。在pom.xml中添加以下依赖:<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>添加依赖后,Spring Boot会自动配置Thymeleaf,默认情况下,Thymeleaf模板文件位于src/main/resources/templates目录下。
Thymeleaf使用特定的标签属性来处理动态内容,这些属性以`th:`开头。以下是一个简单的Thymeleaf模板示例:<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Home Page</title>
</head>
<body>
<h1>Welcome, <span th:text="${user.name}">Guest</span>!</h1>
<h2>User List</h2>
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Email</th>
</tr>
<tr th:each="user : ${users}">
<td th:text="${user.id}">1</td>
<td th:text="${user.name}">John Doe</td>
<td th:text="${user.email}">john@example.com</td>
</tr>
</table>
<a th:href="@{/logout}">Logout</a>
</body>
</html>在这个模板中,我们使用了以下Thymeleaf特性:
- `th:text`:替换标签内的文本内容
- `th:each`:循环遍历集合
- `th:href`:处理URL链接
接下来,我们需要创建一个控制器来处理请求并传递数据到模板。以下是一个简单的控制器示例:package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import java.util.List;
@Controller
public class HomeController {
@Autowired
private UserService userService;
@GetMapping("/")
public String home(Model model) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String email = auth.getName();
User currentUser = userService.findByEmail(email);
model.addAttribute("user", currentUser);
List<User> users = userService.getAllUsers();
model.addAttribute("users", users);
return "home";
}
}在这个控制器中,我们获取当前登录用户的信息,并将其传递到模板中。同时,我们还获取了所有用户的列表,并将其也传递到模板中。
Thymeleaf还支持条件判断、表达式计算等功能。以下是一些常用的Thymeleaf表达式:
- `${...}`:变量表达式,用于获取上下文中的变量
- `*{...}`:选择变量表达式,用于获取选中对象的属性
- `#{...}`:消息表达式,用于国际化
- `@{...}`:URL表达式,用于生成URL
- `~{...}`:片段表达式,用于模板片段
例如,我们可以使用条件判断来显示不同的内容:<div th:if="${user.role == 'ADMIN'}">
<p>You have administrator privileges.</p>
</div>
<div th:unless="${user.role == 'ADMIN'}">
<p>You have standard user privileges.</p>
</div>
Thymeleaf还支持模板布局,可以将公共的页面元素提取到一个布局模板中,然后在其他模板中引用。以下是一个简单的布局示例:<!-- layouts/default.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title th:text="${title}">Default Title</title>
<meta charset="UTF-8" />
<link rel="stylesheet" type="text/css" href="/css/style.css" />
</head>
<body>
<header>
<h1>My Application</h1>
<nav>
<a th:href="@{/}">Home</a>
<a th:href="@{/users}">Users</a>
<a th:href="@{/logout}">Logout</a>
</nav>
</header>
<main th:insert="${content} :: content"></main>
<footer>
<p>© 2023 My Application</p>
</footer>
</body>
</html>
然后在其他模板中可以这样引用:<!-- home.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:replace="layouts/default :: layout(title='Home Page')">
<body>
<section th:fragment="content">
<h1>Welcome to the Home Page</h1>
<p>Hello, <span th:text="${user.name}">Guest</span>!</p>
</section>
</body>
</html>
Thymeleaf还支持表单处理。以下是一个简单的表单示例:<form th:action="@{/users/save}" th:object="${user}" method="post">
<input type="hidden" th:field="*{id}" />
<div>
<label>Name: <input type="text" th:field="*{name}" /></label>
</div>
<div>
<label>Email: <input type="email" th:field="*{email}" /></label>
</div>
<div>
<input type="submit" value="Save" />
</div>
</form>
对应的控制器方法:@PostMapping("/users/save")
public String saveUser(@ModelAttribute("user") User user) {
userService.saveUser(user);
return "redirect:/users";
}
Thymeleaf是一个功能强大且易于使用的模板引擎,它与Spring Boot的集成非常简单。通过合理使用Thymeleaf的各种特性,我们可以高效地开发出动态、美观的Web页面,同时保持代码的可维护性和可测试性。