📜  Spring Boot – Thymeleaf 是如何工作的?

📅  最后修改于: 2022-05-13 01:55:24.004000             🧑  作者: Mango

Spring Boot – Thymeleaf 是如何工作的?

Thymeleaf 是一个Java库和模板引擎,用于解析应用程序生成的数据并将其呈现为模板文件,从而提供转换。它就像 HTML,但提供了更多用于处理渲染数据的属性。它允许缓存已解析的数据/文件以提高生产效率。它可以处理的模板类型有——HTML、JAVASCRIPT、CSS、XML、TEXT、RAW。

与 Spring-Boot 一起使用的模板引擎:

  1. 百里香叶
  2. 自由标记
  3. 胡子
  4. 时髦的
  5. Java服务器页面

Thymeleaf 如何与 Spring-Boot 配合使用?

  1. Thymeleaf 遵循解耦架构——它不知道任何 Web 框架。
  2. 同样的,它不知道 Spring 对模型的抽象,因此无法处理控制器放置在模型中的数据。
  3. 当 Spring-Boot 的自动配置在类路径中检测到 Thymeleaf 时,它会为 Spring MVC 创建支持 Thymeleaf 视图的 bean。
  4. 它可以与 Servlet 的请求属性一起工作。
  5. 因此,Spring 将模型数据复制到 Thymeleaf 模板可以使用的请求属性中。

Thymeleaf 模板的简单生命周期

Thymeleaf 模板的客户端-服务器-视图-生命周期

View-Server-Client-Life-Cycle-of-Thymeleaf-Template-2

要使用 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/

项目结构(Maven)

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

控制器(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...

 
            
                            
                            
                               
   

输出: