目录
一.基本介绍
1.Thymeleaf 是什么
1. Thymeleaf
是一个跟
Velocity
、
FreeMarker
类似的模板引擎,可完全替代
JSP
2. Thymeleaf
是一个
java
类库,他是一个
xml/xhtml/html5
的模板引擎,可以作为
mvc
的
web
应用的
view
层
2.Thymeleaf 的优点
1.
实现
JSTL
、
OGNL
表达式效果, 语法相似
, java
程序员上手快
2. Thymeleaf
模版页面无需服务器渲染,也可以被浏览器运行,页面简洁。
3. SpringBoot
支持
FreeMarker
、
Thymeleaf
、
veocity
。
3. Thymeleaf 的缺点
1. Thymeleaf: Thymeleaf is a modern server-side Java template engine for both web and
standalone environments
2.
缺点
:
并不是一个高性能的引擎,适用于单体应用
3.
说明:如果要做一个高并发的应用
,
选择前后端分离更好,但是作为
SpringBoot
推
荐的模板引擎,
在工作中使用到
,
也能搞定
二.Thymeleaf 机制说明
1. Thymeleaf
是服务器渲染技术
,
页面数据是在服务端进行渲染的
2.
比如
: manage.html
中一段
thymeleaf
代码
,
是在用户请求该页面时,有
thymeleaf
模板
引擎完成处理的
(
在服务端完成
),
并将结果页面返回
.
![](https://img-blog.csdnimg.cn/abaa5c1002f542db8ae752e61a3d0a1f.png)
3. 因此使用了 Thymeleaf , 并不是前后端分离
三.Thymeleaf 语法
1. 表达式
1. 表达式一览
表达式名字
|
语法
|
用途
|
变量取值 |
${...}
|
获取请求域、session 域、对象等值
|
选择变量 |
*{...}
|
获取上下文对象值
|
消息 |
#{...}
|
获取国际化等值
|
链接 |
@{...}
|
生成链接
|
片段表达式 |
~{...}
|
jsp:include
作用,引入公共页面片段
|
2. 字面量
文本值
: 'hsp edu' , 'hello' ,…
数字
: 10 , 7 , 36.8 , …
布尔值
: true , false
空值
: null
变量:
name
,
age
,
....
变量不能有空格
3. 文本操作
文本操作
字符串拼接
: +
变量替换
: |age= ${age}|
2.运算符
1. 数学运算
运算符
: + , - , * , / , %
2. 布尔运算
运算符
: and , or
一元运算
: ! , not
3. 比较运算
比较
: > , < , >= , <= ( gt , lt , ge , le )
等式
: == , != ( eq , ne )
4. 条件运算
If-then: (if) ? (then)
If-then-else: (if) ? (then) : (else)
Default: (value) ?: (defaultvalue)
3.th 属性
html
有的属性,
Thymeleaf
基本都有,而常用的属性大概有七八个。其中
th
属性执行的优
先级从
1~8
,数字越低优先级越高
● th:text :设置当前元素的文本内容,相同功能的还有 th:utext ,两者的区别在于前者不会转义 html 标签,后者会。优先级不高: order=7● th:value :设置当前元素的 value 值,类似修改指定属性的还有 th:src , th:href 。优先级不高: order=6● th:each :遍历循环元素,和 th:text 或 th:value 一起使用。注意该属性修饰的标签位置,详细往后看。优先级很高: order=2● th:if :条件判断,类似的还有 th:unless , th:switch , th:case 。优先级较高: order=3● th:insert :代码块引入,类似的还有 th:replace , th:include ,三者的区别较大,若使用不恰当会破坏 html 结构,常用于公共代码块提取的场景。优先级最高: order=1● th:fragment :定义代码块,方便被 th:insert 引用。优先级最低: order=8● th:object :声明变量,一般和 *{} 一起配合使用,达到偷懒的效果。优先级一般:order=4● th:attr :修改任意属性,实际开发中用的较少,因为有丰富的其他 th 属性帮忙,类似的还有 th:attrappend , th:attrprepend 。优先级一般: order=5
4.迭代
![](https://img-blog.csdnimg.cn/e6cc79491177400bbad9796827595a8d.png)
5.条件运算
6.使用 Thymeleaf -th 属性需要注意点
1
、若要使用
Thymeleaf
语法,首先要声明名称空间:
xmlns:th="http://www.thymeleaf.org"
2
、设置文本内容
th:text
,设置
input
的值
th:value
,循环输出
th:each
,条件判断
th:if
,
插入代码块
th:insert
,定义代码块
th:fragment
,声明变量
th:object
3
、
th:each
的用法需要格外注意,打个比方:如果你要循环一个
div
中的
p
标签,则
th:each
属性必须放在
p
标签上。若你将
th:each
属性放在
div
上,则循环的是将整个
div
。
4
、变量表达式中提供了很多的内置方法,该内置方法是用
#
开头,请不要与
#{}
消息表达式
弄混。
四.Thymeleaf 综合案例
1.需求说明
说明
:
使用
SpringBoot + Thymeleaf
完成简单的用户登录
-
列表功能
![](https://img-blog.csdnimg.cn/bc74c880d3484bba903564fb898689ba.png)
2.需求说明
说明
:
使用
SpringBoot + Thymeleaf
完成简单的用户登录
-
思路分析
/
图解
![](https://img-blog.csdnimg.cn/b5a50d8c800e4d18ad7d9e82a25ec072.png)
3.代码实现
1.
创建项目
,
项目名使用
04-springboot-usersys,
老韩还是使用灵活创建项目的方式
.
2.
说明一下,要支持
Thymeleaf,
需要加入
thymeleaf-starter,
在
pom.xml
配置
![](https://img-blog.csdnimg.cn/5335f9dc9eeb437190033246687c15c4.png)
3. 引入 starter-Thymeleaf , 项目会自动完成配置, 程序员按照规则开发即可
![](https://img-blog.csdnimg.cn/434e2553b6b94c6c94a52ee36a37fdfe.png)
4.
创建
index.html
和
manage.html
和静态图片到指定目录,从准备好的拷贝即可
,
注意
我将
html
文件放到
templates/
目录下
,
该目录
,
不能直接访问
============login.html==============
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body bgcolor="#CED3FE">
<hr/>
<div style="text-align: center">
<h1>用户登陆</h1>
<form action="#" method="post">
<label style="color: red"></label><br/>
用户名:<input type="text" style="width:150px" name="name"/><br/><br/>
密 码 :<input type="password" style="width:150px" name="password"/><br/><br/>
<input type="submit" value="登录"/>
<input type="reset" value="重新填写"/>
</form>
</div>
<hr/>
<img src="images/logo.png"/>
</body>
</html>
==============manage.html========================
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>管理后台</title>
</head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<a href='#'>返回管理界面</a> <a href='#'>安全退出</a> 欢迎您:XXX
<hr/>
<div style="text-align: center">
<h1>管理雇员~</h1>
<table border="1px" cellspacing="0" bordercolor="green" style="width:800px;margin:
auto">
<tr bgcolor="pink">
<td>id</td>
<td>name</td>
<td>pwd</td>
<td>email</td>
<td>job</td>
<td>salary</td>
</tr>
<tr>
<td>a</td>
<td>b</td>
<td>c</td>
<td>d</td>
<td>e</td>
<td>f</td>
</tr>
</table>
<br/>
</div>
<hr/>
<img src="images/logo.png"/>
</body>
</html>
1.bean/Admin.java
@Data
public class Admin {
private String name;
private String password;
}
2.bean/User.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
private String name;
private String password;
private Integer age;
private String email;
}
3.controller/IndexController.java 默认进入登录页面
@Controller
public class IndexController {
//编写方法,转发到登录页面
@GetMapping(value = {"/", "/login"})
public String login() {
/**
* 解读
* 1. 因为我们引入了starter-thymeleaf
* 2. 这里就会直接使用视图解析到 thymeleaf下的模板文件adminLogin.html
*/
return "adminLogin";
}
}
4.controller/AdminController.java 处理登录请求 完成测试
@Controller
@Slf4j
public class AdminController {
//响应用户的登录请求
@PostMapping("/login")
public String login(Admin admin, HttpSession session, Model model) {
//验证用户是否合法
if (StringUtils.hasText(admin.getName()) && "666".equals(admin.getPassword())) {
//将登录用户保存到session
session.setAttribute("loginAdmin", admin);
//合法, 重定向到manage.html
//请小伙伴回忆,java web, 不使用请求转发是防止刷新页面会重复提交
//这里老师为什么是写的 manage.html, 因为这样可以更加明确的表示到哪个页面
//manage.html表示要去找 方法的映射路径为 manage.html
return "redirect:/manage.html";
} else {
//不合法,就重新登录, 请求转发
model.addAttribute("msg", "账号/用户错误");
return "adminLogin";
}
}
//处理用户的请求到 manage.html
@GetMapping("/manage.html")
public String mainPage(Model model, HttpSession session) {
//这里老师暂时使用在方法验证,后面我们统一使用拦截器来验证
log.info("进入mainPage()");
//可以这里集合-模拟用户数据, 放入到request域中,并显示
ArrayList<User> users = new ArrayList<>();
users.add(new User(1, "关羽~", "666666", 20, "gy@sohu.com"));
users.add(new User(2, "张飞", "666666", 30, "zf@sohu.com"));
users.add(new User(3, "赵云", "666666", 22, "zy@sohu.com"));
users.add(new User(4, "马超", "666666", 28, "mc@sohu.com"));
users.add(new User(5, "黄忠", "666666", 50, "hz@sohu.com"));
//将数据放入到request域
model.addAttribute("users", users);
return "manage"; //这里才是我们的视图解析到 /templates/manage.html
//Object loginAdmin = session.getAttribute("loginAdmin");
//if(null != loginAdmin) {//说明成功登录过
// //可以这里集合-模拟用户数据, 放入到request域中,并显示
// ArrayList<User> users = new ArrayList<>();
// users.add(new User(1, "关羽~", "666666", 20, "gy@sohu.com"));
// users.add(new User(2, "张飞", "666666", 30, "zf@sohu.com"));
// users.add(new User(3, "赵云", "666666", 22, "zy@sohu.com"));
// users.add(new User(4, "马超", "666666", 28, "mc@sohu.com"));
// users.add(new User(5, "黄忠", "666666", 50, "hz@sohu.com"));
//
// //将数据放入到request域
// model.addAttribute("users", users);
//
// return "manage"; //这里才是我们的视图解析到 /templates/manage.html
//} else {
// //这里就返回登录页,并给出提示
// model.addAttribute("msg","你没有登录/请登录");
// return "adminLogin";//请求转发到adminLogin.html
//}
}
}
5.修改
manage.html ,
显示用户列表
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>管理后台</title>
</head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<a href='#'> 返 回 管 理 界 面 </a> <a href='#' th:href="@{/}"> 安 全 退 出 ~</a> 欢 迎
您:[[${session.loginAdmin.name}]]
<hr/>
<div style="text-align: center">
<h1>管理雇员~</h1>
<table border="1px" cellspacing="0" bordercolor="green" style="width:800px;margin:
auto">
<tr>
<td>id</td>
<td>name</td>
<td>age</td>
<td>email</td>
<td>password</td>
</tr>
<tr bgcolor="pink" th:each="user: ${users}">
<!-- [[${user.id}]] 就是 th 的行内写法 -->
<td>[[${user.id}]]</td>
<td th:text="${user.name}"></td>
<td>[[${user.age}]]</td>
<td>[[${user.email}]]</td>
<td>[[${user.password}]]</td>
</tr>
</table>
<br/>
</div>
<hr/>
<img src="images/logo.png"/>
</body>
</html>
6.
修改
login.html ,
显示登录错误信息和提交
action
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>管理后台</title>
</head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<a href='#'>返回管理界面</a> <a href='#' th:href="@{/}">安全退出</a> 欢迎您:[[${session.loginAdmin.name}]]
<hr/>
<div style="text-align: center">
<h1>管理雇员~</h1>
<table border="1px" cellspacing="0" bordercolor="green" style="width:800px;margin: auto">
<tr bgcolor="pink">
<td>id</td>
<td>name</td>
<td>pwd</td>
<td>email</td>
<td>age</td>
</tr>
<tr bgcolor="#ffc0cb" th:each="user:${users}">
<td th:text="${user.id}">a</td>
<td th:text="${user.name}">b</td>
<td th:text="${user.password}">c</td>
<td th:text="${user.email}">d</td>
<td th:text="${user.age}">e</td>
</tr>
</table>
<br/>
</div>
<hr/>
<img src="images/logo.png"/>
</body>
</html>