SpringBoot整合Thymeleaf以及Thymeleaf语法详解

SpringBoot的源码我全部放在下面链接上了,链接里面有我整理的SpringBoot整合其他技术的源码以及教程,还有SpringBoot的其他学习资料,欢迎大家来下载学习,如果该教程对你有所帮助,还请star支持一下,谢谢!
源码链接:https://gitee.com/oldou/springbootstudy

简介

  • Thymeleaf 的主要目标是将优雅的自然模板带到开发工作流程中,并将 HTML 在浏览器中正确显示,并且可以作为静态原型,让开发团队能更容易地协作。
  • Thymeleaf 能够处理HTML,XML,JavaScript,CSS 甚至纯文本。
  • 长期以来,JSP在视图领域有非常重要的地位,随着时间的变迁,出现了一位新的挑战者:Thymeleaf,Thymeleaf 是原生的,不依赖于标签库。它能够在接受原始 HTML 的地方进行编辑和渲染。因为它没有与Servelet规范耦合,因此Thymeleaf模板能进入jsp所无法涉足的领域。

总结:其实就是一个模板引擎,可以为模板作数据渲染。

Thymeleaf的基本使用

导包

新建一个SoringBoot项目,在pom文件中需要添加Thymeleaf启动器依赖

<!--添加Thymeleaf启动器依赖-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

当然也要添加Web启动器。

测试

创建一个Controller

/**
 * 页面跳转
 */
@Controller
public class PageController {
    
    

 @GetMapping("/show")
 public String showPage(Model model){
    
    
     model.addAttribute("msg","Hello Thymeleaf");
     model.addAttribute("date",new Date());
     return "index";
 }

}

创建一个html文件

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Welcome  to  index</title>
</head>
<body>
    <span th:text="bjsxt"></span>
    <hr/>
    <span th:text="${msg}"></span>
</body>
</html>

Thymeleaf语法

使用Thymeleaf时要将命名空间复制到html的标签当中;
命名空间:xmlns:th="http://www.thymeleaf.org"

字符串与变量输出操作

th:text :在页面中输出值,将一个内容渲染到一个指定标签中

th:value : 可以将一个值放入到 input 标签的 value 中

<span th:text="bjsxt"></span>
<hr/>
<span th:text="${msg}"></span>
<hr/>
<input th:value="${msg}" />

字符串操作

Thymeleaf 提供了一些内置对象,内置对象可直接在模板中使用。这些对象是以#引用的。

使用内置对象的语法:

  • 引用内置对象需要使用 #
  • 大部分内置对象的名称都以s结尾。如:strings、numbers、dates

${#strings.isEmpty(key)} :判断字符串是否为空,如果为空返回 true,否则返回 false

${#strings.contains(msg,'T')}: 判断字符串是否包含指定的子串,如果包含返回 true,否则返回 false

${#strings.startsWith(msg,'a')}:判断当前字符串是否以子串开头,如果是返回 true,否则返回 false

${#strings.endsWith(msg,'a')}:判断当前字符串是否以子串结尾,如果是返回 true,否则返回 false

${#strings.length(msg)}:返回字符串的长度

${#strings.indexOf(msg,'h')}:查找子串的位置,并返回该子串的下标,如果没找到则返回-1

${#strings.substring(msg,2)}
${#strings.substring(msg,2,5)}
截取子串,用户与 jdk String 类下 SubString 方法相同

${#strings.toUpperCase(msg)}
${#strings.toLowerCase(msg)}
字符串转大小写。

测试代码:

<hr/>
判断字符串是否为空:
<span th:text="${#strings.isEmpty(msg)}"></span>
<hr/>
判断字符串是否包含这个字符:
<span th:text="${#strings.contains(msg,'T')}"></span>
<hr/>
判断字符串是否以这个字符开头:
<span th:text="${#strings.startsWith(msg,'T')}"></span>
<hr/>
判断字符串是否以这个字符结尾:
<span th:text="${#strings.endsWith(msg,'f')}"></span>
<hr/>
返回字符串的长度:
<span th:text="${#strings.length(msg)}"></span>
<hr/>
返回指定字符的下标:
<span th:text="${#strings.indexOf(msg,'e')}"></span>
<hr/>
截取字符串(从下标为3开始截取):
<span th:text="${#strings.substring(msg,3)}"></span>
<hr/>
截取字符串0-3(不包括下标为3的):
<span th:text="${#strings.substring(msg,0,3)}"></span>
<hr/>
转小写:
<span th:text="${#strings.toLowerCase(msg)}"></span>
<hr/>
转大写:
<span th:text="${#strings.toUpperCase(msg)}"></span>

日期格式化处理

${#dates.format(key)}:格式化日期,默认的以浏览器默认语言为格式化标准

${#dates.format(key,'yyyy/MM/dd')}:按照自定义的格式做日期转换

${#dates.year(key)}
${#dates.month(key)}
${#dates.day(key)}

  • Year:取年
  • Month:取月
  • Day:取日

测试代码:

获取当前浏览器的时间:
<span th:text="${#dates.format(date)}"></span>
<hr/>
将时间的格式转换:
<span th:text="${#dates.format(date,'yyyy/MM/dd')}"></span>
<hr/>
获取当前的年份:
<span th:text="${#dates.year(date)}"></span>
<hr/>
获取当前的月份:
<span th:text="${#dates.month(date)}"></span>
<hr/>
获取当前的日份:
<span th:text="${#dates.day(date)}"></span>

条件判断

  • th:if:条件判断

  • th:switch / th:case
    th:switch / th:case 与 Java 中的 switch 语句等效,有条件地显示匹配的内容。如果有
    多个匹配结果只选择第一个显示。
    th:case="*“表示 Java 中 switch 的 default,即没有 case 的值为 true 时则显示 th:case=” * " 的内容。

测试代码:

<hr/>
<div>
    <span th:if="${sex} == ''">
        性别:男
    </span>
    <span th:if="${sex} == ''">
        性别:女
    </span>
</div>
<div th:switch="${id}">
    <span th:case="1">判断结果:ID为1</span>
    <span th:case="2">判断结果:ID为2</span>
    <span th:case="3">判断结果:ID为3</span>
    <span th:case="4">判断结果:ID为4</span>
    <span th:case="*">判断结果:ID为*</span>
</div>

迭代遍历

  • th:each:迭代器,用于循环迭代集合

先去创建一个pojo包,然后创建一个Users类{id(String),name(String),age(int)},接下来就是在页面跳转的Controller中新建一个List,代码如下所示:

List<Users> list = new ArrayList<>();
list.add(new Users("1","admin",18));
list.add(new Users("2","sxtqq",12));
list.add(new Users("3","ouou",14));
list.add(new Users("4","jojo",15));
model.addAttribute("list",list);
<hr/>
<table border="1px" width="50%">
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Age</th>
    </tr>
    <tr th:each="u : ${list}" align="center">
        <td th:text="${u.id}"></td>
        <td th:text="${u.name}"></td>
        <td th:text="${u.age}"></td>
    </tr>
</table>

th:each 状态变量

  • index:当前迭代器的索引 从 0 开始
  • count:当前迭代对象的计数 从 1 开始
  • size:被迭代对象的长度
  • odd/even:布尔值,当前循环是否是偶数/奇数 从 0 开始
  • first:布尔值,当前循环的是否是第一条,如果是返回 true 否则返回 false
  • last:布尔值,当前循环的是否是最后一条,如果是则返回 true 否则返回 false

测试代码

<hr/>
<table border="1px" width="50%">
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Age</th>

        <th>Index</th>
        <th>Count</th>
        <th>Size</th>
        <th>Odd</th>
        <th>Even</th>
        <th>First</th>
        <th>Last</th>
    </tr>
    <tr th:each="u,sb : ${list}" align="center">
        <td th:text="${u.id}"></td>
        <td th:text="${u.name}"></td>
        <td th:text="${u.age}"></td>

        <td th:text="${sb.index}"></td>
        <td th:text="${sb.count}"></td>
        <td th:text="${sb.size}"></td>
        <td th:text="${sb.odd}"></td>
        <td th:text="${sb.even}"></td>
        <td th:text="${sb.first}"></td>
        <td th:text="${sb.last}"></td>
    </tr>
</table>

th:each 迭代 Map

Map<String,Users> map = new HashMap<>();
map.put("user1",new Users("1","admin",18));
map.put("user2",new Users("2","sxtqq",12));
map.put("user3",new Users("3","ouou",14));
model.addAttribute("map",map);
<hr/>
<table border="1px" width="50%">
    <tr>
        <th>Value</th>
    </tr>
    <tr th:each="m : ${map}" align="center">
        <td th:text="${m}"></td>
    </tr>
</table>

<hr/>
<table border="1px" width="50%">
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Age</th>
        <th>Key</th>
    </tr>
    <tr th:each="m1 : ${map}" align="center">
        <td th:text="${m1.value.id}"></td>
        <td th:text="${m1.value.name}"></td>
        <td th:text="${m1.value.age}"></td>
        <td th:text="${m1.key}"></td>
    </tr>
</table>

操作域对象

HttpServletRequest

 request.setAttribute("req", "HttpServletRequest");
<span th:text="${#httpServletRequest.getAttribute('req')}"></span>
<span th:text="${#request.getAttribute('req')}"></span>

HttpSession

request.getSession().setAttribute("sess", "HttpSession");
<span th:text="${session.ses}"></span><br/>
<span th:text="${#session.getAttribute('ses')}"></span><br/>

ServletContext

request.getSession().getServletContext().setAttribute("app","Application");
<span th:text="${application.app}"></span>
<span th:text="${#servletContext.getAttribute('app')}"></span>

URL 表达式

语法:在 Thymeleaf 中 URL 表达式的语法格式为 @{}

URL 类型:

  • 绝对路径:<a th:href="@{http://www.baidu.com}">绝对路径</a>

  • 相对路径
    相对于当前项目的根<a th:href="@{/show}">相对路径</a>
    相对于服务器路径的根
    <a th:href="@{~/project2/resourcename}">相对于服务器的根</a>

  • 在 URL 中传递参数
    在普通格式的 URL 中传递参数
    (1)<a th:href="@{/show?id=1&name=zhangsan}">普通 URL 格式传参</a>
    (2)<a th:href="@{/show(id=1,name=zhangsan)}">普通 URL 格式传参</a>
    (3)<a th:href="@{'/show?id='+${id}+'&name='+${name}}">普通 URL 格式传参</a>
    (4)<a th:href="@{/show(id=${id},name=${name})}">普通 URL 格式传参</a>
    在 restful 格式的 URL 中传递参数
    (1)<a th:href="@{/show/{id}(id=1)}">restful 格式传参</a>
    (2)<a th:href="@{/show/{id}/{name}(id=1,name=admin)}">restful 格 式 传 参</a>
    (3)<a th:href="@{/show/{id}(id=1,name=admin)}">restful 格式传参</a>
    (4)<a th:href="@{/show/{id}(id=${id},name=${name})}">restful 格式传参</a>

在配置文件中配置 Thymeleaf

spring.thymeleaf.prefix=classpath:/templates/suibian/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML # 配置视图模板类型,如果视图模板使用的是html5需要配置
#配置编码格式
spring.thymeleaf.encoding=utf-8
spring.thymeleaf.servlet.content-type=text/html # 响应类型
# 配置页面缓存
spring.thymeleaf.cache=false

我们可以找到ThymeleafAutoConfiguration这个自动配置类,然后再找到ThymeleafProperties这个Thymeleaf的自动配置文件,里面有关于Thymeleaf的所有配置信息,我们使用application.properties/yml文件去配置Thymeleaf,其实就是在给ThymeleafProperties这个类中的属性赋值。
如下所示:
在这里插入图片描述

当然,这里关于Thymeleaf的语法介绍并没有介绍得很全,详细的语法介绍还是得从官网中进行学习, http://www.thymeleaf.org,希望这篇文章对大家有所帮助。

猜你喜欢

转载自blog.csdn.net/weixin_43246215/article/details/108486036
今日推荐