Thymeleaf是SpringBoot推荐使用的页面模板引擎,可以完全取代JSP,即使没有服务器环境也能正常双击打开展示静态HTML页面。
官方链接:https://www.thymeleaf.org/

基本使用

添加依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  4. </dependency>

默认配置为

  1. spring:
  2. thymeleaf:
  3. encoding: utf-8
  4. prefix: classpath:/templates/
  5. suffix: .html
  6. enabled: true # 代表开启thymeleaf模板功能
  7. servlet:
  8. content-type: text/html # 返回的响应类型

默认前缀为:classpath:/templates/ 。默认后缀为:.html

新建templates文件夹,在该文件夹下面存放页面
image.png
默认情况下templates文件夹里面的内容是不能直接通过浏览器访问的,只能通过转发。

  1. @Controller
  2. public class LoginController {
  3. @RequestMapping("/index")
  4. public String testIndex(){
  5. return "index";
  6. }
  7. }

image.png

以前我们做转发的时候可以设置一些数据,在转发后的页面里面取值,在thymeleaf里面我们怎么做呢?方式有很多种

第一种:

  1. @Controller
  2. public class LoginController {
  3. @RequestMapping("/index")
  4. public String testIndex(HttpServletRequest request) {
  5. request.setAttribute("name","lff");
  6. request.setAttribute("age",18);
  7. return "index";
  8. }
  9. }

页面模板取值

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div th:text="${name}"></div>
  9. <div th:text="${age}"></div>
  10. this is index.html
  11. </body>
  12. </html>

注意:页面一定要加xmlns:th=”http://www.thymeleaf.org” 加这个才能找到thymeleaf的标签。

第二种:

使用Model存储数据

  1. @RequestMapping("/index")
  2. public String testIndex(Model model) { //Model参数不是SpringBoot特有的,可以在SpringMVC里面使用
  3. model.addAttribute("name","lff");
  4. model.addAttribute("age",18);
  5. return "index";
  6. }

页面模板取值

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <div th:text="${name}"></div>
  9. <div th:text="${age}"></div>
  10. this is index.html
  11. </body>
  12. </html>

由于默认情况下/templates/目录下的内容只能通过转发访问,如果想直接访问,可以把静态资源放在如下任意目录下:

  1. "classpath:/META-INF/resources/",
  2. "classpath:/resources/",
  3. "classpath:/static/",
  4. "classpath:/public/"

上面的路径是如何知道的?在配置文件中,点击下面的static-locations就跳转到相关的配置类了

  1. spring:
  2. resources:
  3. static-locations:

image.png
直接访问
image.png

常用表达式

  1. <!--字面量解析-->
  2. <!--这种字面量直接解析不了的,会抛异常-->
  3. <!--<div th:text="My name is Mr Time"></div>-->
  4. <!--用单引号-->
  5. <div th:text="'My name is Mr Time'"></div>
  6. <!--用| |-->
  7. <div th:text="|My name is Mr Time|"></div>
  8. <div th:text="${name} + 'My name is Mr Time'"></div>
  9. <!--数字类型-->
  10. <div th:text="10"></div>
  11. <div th:text="10*2"></div>
  12. <!--三目运算符-->
  13. <div th:text="${name} ? ${name} : '不存在'"></div>
  14. <!--等价于${name} ? ${name} : '不存在'-->
  15. <div th:text="${name} ?: '不存在'"></div>
  16. <!--等价于${name} ? 'name有值' :''-->
  17. <div th:text="${name} ? 'name有值' "></div>
  18. <!--动态绑定class-->
  19. <div th:class="${name}">
  20. </div>

获取对象类型

  1. <!--可以这样从对象里面取值-->
  2. <div th:text="${person.name}"></div>
  3. <!--也可以这样从对象里面取值-->
  4. <div th:object="${person}">
  5. <!-- 取出person的name-->
  6. <div th:text="*{name}"></div>
  7. </div>
  8. <!--条件判断-->
  9. <div th:if="${person.age > 5}" th:text="888">
  10. </div>
  11. <div th:switch="${person.age}" >
  12. <div th:case="${person.age < 18}" th:text="'age < 18'"></div>
  13. <div th:case="*" th:text="'默认匹配' + ${person.age}"></div>
  14. </div>
  15. <!--遍历-->
  16. <div th:each="dog,status : ${person.dogs}">
  17. <div th:text="${dog.name}"></div>
  18. <div th:text="${dog.age}"></div>
  19. <div th:text="${status.index}"></div>
  20. </div>
  21. <!--block表示占位,并不渲染该标签-->
  22. <th:block th:each="dog,status : ${person.dogs}">
  23. <div th:text="${dog.name}"></div>
  24. <div th:text="${dog.age}"></div>
  25. <div th:text="${status.index}"></div>
  26. </th:block>

链接表达式

假设当前URL为:

  1. http://localhost:8080/context_test/lff/link

contextPath为:context_test

  1. <!-- 假设当前页面的链接为: http://localhost:8080/context_test/lff/link-->
  2. <!-- 表示链接为:http://localhost:8080/context_test/user/login-->
  3. <a th:href="@{/user/login}">相对于contextPath</a>
  4. <!-- 表示链接为:http://localhost:8080/context_test/lff/user/login-->
  5. <a th:href="@{user/login}">相对于当前页面的链接</a>
  6. <!-- 表示链接为:http://localhost:8080/user/login-->
  7. <a th:href="@{~user/login}">相对于服务端的IP:port</a>
  8. <!-- 表示链接为:http://example.com-->
  9. <a th:href="@{//example.com}">相对于协议</a>
  10. <!-- 表示链接为:http://localhost:8080/context_test/user/login?name='lff'&password='123'&code=456-->
  11. <a th:href="@{/user/login(name=${name},password=${password},code=${code})}"></a>
  12. <!-- 表示链接为:http://localhost:8080/context_test/user/18/login-->
  13. <a th:href="@{/user/{num}/login(num=18)}"></a>

常用内置对象

官方链接:https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#appendix-a-expression-basic-objects