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,希望这篇文章对大家有所帮助。