天天看点

Spring Boot 引入 Thymeleaf 及入门1. 模板引擎2. Spring Boot 使用 Thymeleaf3. 引入 Thymeleaf4. 渲染流程规则5. 后台控制层6. 前台页面手动渲染Thymeleaf源码解析

文章目录

  • 1. 模板引擎
  • 2. Spring Boot 使用 Thymeleaf
  • 3. 引入 Thymeleaf
  • 4. 渲染流程规则
  • 5. 后台控制层
  • 6. 前台页面
  • 手动渲染Thymeleaf
  • 源码解析

以前开发 web 项目时,只需将静态的 "html” 页面后缀名修改为“jsp”,然后在文件中加入jsp页面标识即可做jsp开发。

1. 模板引擎

1、市面上主流的 Java 模板引擎有:JSP、Velocity、Freemarker、Thymeleaf

2、JSP 本质也是模板引擎,Spring Boot 默认是不支持jsp的,官方推荐使用 “Thymeleaf”模板引擎

3、模板引擎原理图如下,模板引擎的作用都是将模板(页面)和数据进行整合然后输出显示,区别在于不同的模板使用不同的语法,如 JSP 的JSTL表达式,以及JSP 自己的表达式和语法,同理 Thymeleaf 也有自己的语法

Spring Boot 引入 Thymeleaf 及入门1. 模板引擎2. Spring Boot 使用 Thymeleaf3. 引入 Thymeleaf4. 渲染流程规则5. 后台控制层6. 前台页面手动渲染Thymeleaf源码解析

2. Spring Boot 使用 Thymeleaf

1、Thymeleaf 官网:https://www.thymeleaf.org/

2、Thymeleaf 在Github 的主页:https://github.com/thymeleaf/thymeleaf

3. 引入 Thymeleaf

1、使用 Thymeleaf 同样只需要在 pom.xml 引入此模块即可

2、官方文档:“https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/#using-boot-starter”

<!-- 引入thymeleaf模板引擎-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
           

4. 渲染流程规则

1、使用非常简单,可以找到它的自动配置文件即可查看它的使用规则

Spring Boot 引入 Thymeleaf 及入门1. 模板引擎2. Spring Boot 使用 Thymeleaf3. 引入 Thymeleaf4. 渲染流程规则5. 后台控制层6. 前台页面手动渲染Thymeleaf源码解析

2、其中默认规则如下:

  • 默认前缀:DEFAULT_PREFIX = “classpath:/templates/”
  • 默认后缀:DEFAULT_SUFFIX = “.html”

这完全类似 Spring MVC 的映射规则,如果想修改这些配置只需要在全局配置文件中覆盖修改即可。

3、所以默认只要把 HTML 页面放在 classpath:/templates/ 下,thymeleaf 就能自动渲染, classpath:/templates/ 目录以外的 html 文件是无法使用 Thymeleaf 引擎的。

4、当然自己可以在全局配置文件中覆盖修改这些规则,修改的选项可以从 “ThymeleafProperties” 文件中找到,也可以参 考官方文档配置:

#THYMELEAF (ThymeleafAutoConfiguration)
spring.thymeleaf.prefix=classpath:/templates/ # Prefix that gets prepended to view names when building a URL.
spring.thymeleaf.servlet.content-type=text/html # Content-Type value written to HTTP responses.
spring.thymeleaf.suffix=.html # Suffix that gets appended to view names when building a URL.
           

5. 后台控制层

/**
 * @RestController :表示本类所有的方法都是直接做内容返回到浏览器
 * @Controller :控制层
 */
@Controller
public class HelloController {

    @RequestMapping("/home")
    public String home(Map<String, Object> paramMap) {
        /** 默认Map的内容会放大请求域中,页面可以直接取值*/
        paramMap.put("name", "James");
        /** 会自动跳转到默认的 classpath:/templates/success.html 页面*/
        return "home";
    }

}
           

注意不要使用

@RestController

作为控制层,

@RestController

默认将方法返回值直接返回给浏览器,不会做视图映射。

在控制层中返回

逻辑视图名+数据

,逻辑视图名为

home

,意思是需要在

resources/templates

目录下提供一个名为

home.html

的 Thymeleaf 模板文件。

6. 前台页面

<!DOCTYPE html>
<!--作用是让IDEA编辑器有Thymeleaf语法提示,不写不影响运行-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
	<!--取值语法之一-->
    <p th:text="${name}"></p>
</body>
</html>
           

浏览器访问:

http://localhost:8080/home

手动渲染Thymeleaf

上面都是自动渲染 Thymeleaf 模板后返回给浏览器,我们也可以手动渲染 Thymeleaf 模板,这个一般在邮件发送时候有用,例如在 resources/templates 目录下新建一个邮件模板,文件名:

mail.html

,如下:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>hello 欢迎 <span th:text="${username}"></span>加入 XXX 集团,您的入职信息如下:</p>
<table border="1">
    <tr>
        <td>职位</td>
        <td th:text="${position}"></td>
    </tr>
    <tr>
        <td>薪水</td>
        <td th:text="${salary}"></td>
    </tr>
</table>
<img src="http://www.javaboy.org/images/sb/javaboy.jpg" alt="">
</body>
</html>
           

现在需要将这个 HTML 模板渲染成一个 String 字符串。

@SpringBootTest
@RunWith(SpringRunner.class)
public class DemoTests {

    @Autowired
    TemplateEngine templateEngine;

    @Test
    public void test(){
        Context context = new Context();
        context.setVariable("username", "James");
        context.setVariable("position", "Java工程师");
        context.setVariable("salary", 99999);
        String mail = templateEngine.process("mail", context);
        System.out.println(mail);
    }

}
           
  • 注入一个 TemplateEngine 对象,这个对象就是在 Thymeleaf 的自动化配置类中配置的(即当我们引入 Thymeleaf 的依赖之后,这个实例就有了)。
  • 构造一个 Context 对象用来存放变量。
  • 调用 process 方法进行渲染,该方法的返回值就是渲染后的 HTML 字符串。

源码解析

Spring Boot 为 Thymeleaf 提供了自动化配置类

org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration

Spring Boot 引入 Thymeleaf 及入门1. 模板引擎2. Spring Boot 使用 Thymeleaf3. 引入 Thymeleaf4. 渲染流程规则5. 后台控制层6. 前台页面手动渲染Thymeleaf源码解析

自动化配置类中,使用 ThymeleafProperties 作为配置类,然后 @ConditionalOnClass 注解表示当当前系统中存在 TemplateMode 和 SpringTemplateEngine 类时,当前的自动化配置类才会生效,即只要项目中引入了 Thymeleaf 相关的依赖,这个配置就会生效。

查看下 ThymeleafProperties 配置类。

Spring Boot 引入 Thymeleaf 及入门1. 模板引擎2. Spring Boot 使用 Thymeleaf3. 引入 Thymeleaf4. 渲染流程规则5. 后台控制层6. 前台页面手动渲染Thymeleaf源码解析

前三个 static 变量定义了默认的编码格式、视图解析器的前缀、后缀等。

可以看出来,Thymeleaf 模板的默认位置在 resources/templates 目录下,默认的后缀是 html 。

默认的配置几乎不需要做任何更改就可以直接使用了。

如果有特殊需求,则可以在 application.properties 中配置以 spring.thymeleaf 开头的属性即可。

参考:

Spring Boot 引入 Thymeleaf 及入门