Spring Boot – Thymeleaf 是如何工作的?
Thymeleaf 是一个Java库和模板引擎,用于解析应用程序生成的数据并将其呈现为模板文件,从而提供转换。它就像 HTML,但提供了更多用于处理渲染数据的属性。它允许缓存已解析的数据/文件以提高生产效率。它可以处理的模板类型有——HTML、JAVASCRIPT、CSS、XML、TEXT、RAW。
与 Spring-Boot 一起使用的模板引擎:
- 百里香叶
- 自由标记
- 胡子
- 时髦的
- Java服务器页面
Thymeleaf 如何与 Spring-Boot 配合使用?
- Thymeleaf 遵循解耦架构——它不知道任何 Web 框架。
- 同样的,它不知道 Spring 对模型的抽象,因此无法处理控制器放置在模型中的数据。
- 当 Spring-Boot 的自动配置在类路径中检测到 Thymeleaf 时,它会为 Spring MVC 创建支持 Thymeleaf 视图的 bean。
- 它可以与 Servlet 的请求属性一起工作。
- 因此,Spring 将模型数据复制到 Thymeleaf 模板可以使用的请求属性中。
Thymeleaf 模板的简单生命周期
要使用 Thymeleaf,请在项目构建中添加其依赖项。
Maven – pom.xml
org.springframework.boot
spring-boot-starter-thymeleaf
摇篮 - build.gradle
compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf'
将模板文件放在以下目录中:
/src/main/resources/templates/
1. 渲染单个模型属性
要呈现属性,请在 Thymeleaf 模板中使用 'th:text' 属性
attributeValue will be placed here
控制器(Java)文件:
Java
package gfg;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/")
public class TemplateController {
@GetMapping("/template1")
public String template(Model model) {
String msg = "Welcome to Thymeleaf Template";
// adding the attribute(key-value pair)
model.addAttribute("message", msg);
// returning the view name
return "index";
}
}
HTML
GFG
Welcome to GeeksForGeeks...
message will print here
Java
package gfg;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/")
public class TemplateController2 {
@GetMapping("/template2")
public String template(Model model) {
String message = "Top 5 Cloud Service Providers";
// creating a collection
List list = new ArrayList<>();
list.add("Amazon Web Services");
list.add("Microsoft Azure");
list.add("Google Cloud");
list.add("Alibaba Cloud");
list.add("IBM Cloud");
model.addAttribute("message", message);
// adding the collection attribute
model.addAttribute("cloudProvider", list);
return "index2";
}
}
HTML
GFG2
message will print here
-
items will print here
Java
package gfg;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import gfg.os.OperatingSystem;
@Controller
@RequestMapping("/template3")
public class TemplateController3 {
@GetMapping
public String template(Model model) {
model.addAttribute("ops", new OperatingSystem());
return "index3";
}
@PostMapping
public String template( @ModelAttribute("ops") OperatingSystem os , Model model) {
model.addAttribute("message", os.getOS1()+" "+os.getOS2()+" "+os.getOS3());
return "index";
}
}
Java
package gfg.os;
import lombok.Data;
@Data
public class OperatingSystem {
public String OS1 ,OS2, OS3;
}
HTML
GFG3
Welcome to GeeksForGeeks...
模板 (index.html) 文件:
HTML
GFG
Welcome to GeeksForGeeks...
message will print here
输出:
2. 渲染集合
要呈现集合,请在 Thymeleaf 模板中使用“th:each”属性
items iterated will be placed here
Note: span tag will be iterated as much as the number of collection items.
控制器(Java)文件:
Java
package gfg;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/")
public class TemplateController2 {
@GetMapping("/template2")
public String template(Model model) {
String message = "Top 5 Cloud Service Providers";
// creating a collection
List list = new ArrayList<>();
list.add("Amazon Web Services");
list.add("Microsoft Azure");
list.add("Google Cloud");
list.add("Alibaba Cloud");
list.add("IBM Cloud");
model.addAttribute("message", message);
// adding the collection attribute
model.addAttribute("cloudProvider", list);
return "index2";
}
}
模板 (index2.html) 文件:
HTML
GFG2
message will print here
-
items will print here
输出:
3. 将数据绑定到对象
先决条件:
- 值将绑定到的对象必须具有每个字段的“getter/setter”方法。
- 您可以使用“Lombok”库通过“@Data”注释生成这些方法。
添加 Lombok 的依赖项:Maven (pom.xml)
org.projectlombok
lombok
true
使用 Thymeleaf,输入数据使用 'th:object' 属性绑定到对象
要将输入映射到对象的特定字段,请使用“th:field”属性
控制器(Java)文件:
Java
package gfg;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import gfg.os.OperatingSystem;
@Controller
@RequestMapping("/template3")
public class TemplateController3 {
@GetMapping
public String template(Model model) {
model.addAttribute("ops", new OperatingSystem());
return "index3";
}
@PostMapping
public String template( @ModelAttribute("ops") OperatingSystem os , Model model) {
model.addAttribute("message", os.getOS1()+" "+os.getOS2()+" "+os.getOS3());
return "index";
}
}
待绑定对象的类(Java)文件:
Java
package gfg.os;
import lombok.Data;
@Data
public class OperatingSystem {
public String OS1 ,OS2, OS3;
}
模板 (index3.html) 文件:
HTML
GFG3
Welcome to GeeksForGeeks...
输出:
Note:
- You can use other attributes of Thymeleaf as well.
- The caching of the template is enabled by default.
- You can turn off caching by specifying the following in the ‘application.properties’ file.
spring.thymeleaf.cache=false