文章目录
- 介绍
- 语法
- 1、文本替换
- 2、属性替换
- 3、条件判断
- 4. 列表循环
- 5. 表单处理
- 基本示例
- 视图解析机制
- 视图解析器的默认配置
- 为什么用@Controller可以,用@RestController就只是返回字符串
介绍
Thymeleaf 是一个现代的服务器端 Java 模板引擎,用于在服务器端生成 HTML、XML、JavaScript、CSS 等文件。它常用于构建动态网页应用,尤其是与 Spring Boot 集成时,Thymeleaf 提供了一种简洁且易于使用的模板渲染方式。它可以帮助开发者将数据与视图相结合,并生成动态内容。
语法
1、文本替换
使用 th:text 替换 HTML 元素中的文本内容:
<p th:text="${message}">This is a default message</p>
2、属性替换
可以使用 th:href
, th:src
, th:alt
等替换 HTML 标签的属性值:
<a th:href="@{/home}">Home</a>
<img th:src="@{/images/logo.png}" alt="Logo">
3、条件判断
使用 th:if
和 th:unless
来根据条件判断渲染内容:
<p th:if="${user != null}">Welcome, <span th:text="${user.name}">User</span>!</p>
<p th:unless="${user != null}">Please sign in.</p>
4. 列表循环
<ul>
<li th:each="item : ${items}" th:text="${item}">Item</li>
</ul>
5. 表单处理
th:field
用于将表单输入字段绑定到模型属性。
<form th:action="@{/submit}" th:object="${user}" method="post">
<input type="text" th:field="*{name}" />
<input type="password" th:field="*{password}" />
<button type="submit">Submit</button>
</form>
基本示例
1、引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2、添加控制器
package com.zhangyu.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
// 注意这里一定要使用@Controller,用@RestController不行,具体原因下面会说
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring Boot 3 with Thymeleaf!");
return "hello";
}
}
3、创建 Thymeleaf 模板
在 src/main/resources/templates/ 目录下创建一个 hello.html 文件:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Thymeleaf Example</title>
</head>
<body>
<h1>Thymeleaf Template</h1>
<p th:text="'Message: ' + ${message}"></p>
</body>
</html>
此模板通过 Thymeleaf 展示控制器传递过来的 message 变量。
http://localhost:8080/hello
视图解析机制
在 Spring Boot 和 Thymeleaf 中,当控制器返回一个字符串(如 index),Spring Boot 会自动将这个字符串映射为视图模板(即 HTML 文件)的名称 index.html,并将其渲染为响应。
这是通过 Spring MVC 和 Thymeleaf 的整合机制实现的。
视图解析器的默认配置
- 模板路径:
src/main/resources/templates/
- 模板后缀:
.html
这意味着当你返回 index 作为视图名称时,Spring Boot 会将其解析为路径 src/main/resources/templates/index.html
。
如果你想修改这个默认路径或文件后缀,可以在 application.properties 中进行配置:
spring.thymeleaf.prefix=classpath:/custom_templates/ # 修改模板路径
spring.thymeleaf.suffix=.htm # 修改模板后缀
这样,当你返回 index 时,Spring Boot 将会寻找 src/main/resources/custom_templates/index.htm
。
为什么用@Controller可以,用@RestController就只是返回字符串
在 Spring MVC 中,@Controller 和 @RestController 有不同的作用和行为:
@Controller
:用于定义一个常规的 Spring MVC 控制器,它会返回一个视图名称(如 index),并由视图解析器解析为页面模板。@RestController
:实际上是 @Controller 和 @ResponseBody 的组合,它的作用是让控制器中的每个方法都直接将返回值作为 HTTP 响应的主体返回,而不是视图名称。它不会经过视图解析器,因此不会解析为 Thymeleaf 等模板引擎的视图文件。