服务器渲染技术-->Thymeleaf

news2024/11/25 18:42:55

目录

一.基本介绍

1.Thymeleaf 是什么

2.Thymeleaf 的优点

3. Thymeleaf 的缺点

二.Thymeleaf 机制说明

三.Thymeleaf 语法

1. 表达式

1. 表达式一览

2. 字面量

3. 文本操作

2.运算符

1. 数学运算

2. 布尔运算

3. 比较运算

4. 条件运算

3.th 属性

4.迭代

5.条件运算 

6.使用 Thymeleaf -th 属性需要注意点 

四.Thymeleaf 综合案例

1.需求说明

2.需求说明 

 3.代码实现


一.基本介绍

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 模板
引擎完成处理的 ( 在服务端完成 ), 并将结果页面返回 .

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.迭代

 

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 完成简单的用户登录 - 列表功能

2.需求说明 

说明 : 使用 SpringBoot + Thymeleaf 完成简单的用户登录 - 思路分析 / 图解

 3.代码实现

1. 创建项目 , 项目名使用 04-springboot-usersys, 老韩还是使用灵活创建项目的方式 .
2. 说明一下,要支持 Thymeleaf, 需要加入 thymeleaf-starter, pom.xml 配置

3. 引入 starter-Thymeleaf , 项目会自动完成配置, 程序员按照规则开发即可 

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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/86471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PLC模拟量传输过程

网上对PLC模拟量的一些解释含糊不清&#xff0c;令参考人疑惑重重&#xff0c;搞不懂现场—>PLC—>上位机的过程走向。 . 应该了解什么是数字量&#xff1f;什么是模拟量&#xff1f;下面是我的理解。 数字量&#xff1a;没有单位&#xff0c;表示一个数字&#xff0c;0~…

Linux-iNode-软硬链接

文章目录inode磁盘了解站在OS角度磁盘就是线性结构如何确认inode和后面的那个block相关联呢&#xff1f;如何在大的inode Table中安排一个新文件的inode?目录下创建文件的过程都发生了什么软硬链接软链接&#xff1a;特别像快捷方式使用场景硬链接二者区别&#xff1a;硬链接有…

nodejs+vue+element+eachers构建开源项目大型连续剧(1)搭建nodejs服务器

在前端开发过程中&#xff0c;可能某些时候需要自己搭建一台服务器用于一些文件图片请求或者进行后端相关知识的学习。本文主要讲解如何通过nodejs进行一个基础服务器的搭建&#xff0c;包括如何将文件布置的服务器&#xff0c;以及基础接口的开发。后面可能会更新关于通过node…

从根源帮助改变数据延误, Qlik 辅助金融行业实现信贷渠道预测

信贷行业面临的业务挑战 传统方式下&#xff0c;营利性增长和正确管理信贷组合风险的能力是通过静态报告和电子表格完成的&#xff0c;不仅数据单独进行汇总&#xff0c;同时交付过程也存在延迟。这种情况导致组织不得不基于不完整的信息来制定关键的信贷和定价决策。信贷员需…

研发中台拆分过程的一些心得总结

背景在 21 年&#xff0c;中台拆分在 21 年&#xff0c;以下为中台拆分的过程心得&#xff0c;带有一定的主观&#xff0c;偏向于中小团队中台建设参考&#xff08;这里的中小团队指 3-100 人的团队&#xff09;&#xff0c;对于大型团队不太适用&#xff0c;毕竟大型团队人中 …

Elasticsearch8系列【2】Windows环境安装ES8

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言Windows安装Elasticsearch8.5.21. 下载2. 获取密码3. 注册服务4. 登录安装可视化工具前言 Elasticsearch使用Java语言开发&#xff0c;在安装之前需要安装JDK环境。基本支持所有主流操作系统…

Kioptrix Level2靶机

0x01信息收集 nmap -sV -O 10.121.65.83 0x02 万能密码&&命令执行 访问80端口(经测试 443端口并没有办法访问) 登录框尝试弱口令和sql注入 发现存在万能密码 admin# 存在一个ping命令&#xff0c;尝试通过管道符看是否会执行命令 127.0.0.0|id 存在命令执行漏洞&am…

network判断是否瓶颈

首先判断连接是否建立&#xff1a; tcp主机a->主机b的请求连接命令&#xff0c;半连接队列在主机b 判断半连接队列命令 netstat -s |grep -i listen 值过大&#xff0c;半连接队列无法建立 2.tcp主机a收到主机b的回复&#xff0c;主机a->主机b的连接请求&#xff0c;全…

成才之路杂志社成才之路编辑部成才之路杂志2022年第33期目录

高教与成才研究《成才之路》投稿&#xff1a;cn7kantougao163.com 融媒体时代大学生职业发展与就业指导课程体系建设研究 张效良;李玉波; 1-4 “三全育人”背景下高职辅导员思政教育方法研究 杨春蕊; 5-8 “五育”学生管理模式对高校思政教育的影响研究 张晓英; 9-…

基数排序python

一、基数排序介绍 基数排序&#xff08;radix sort&#xff09;属于“分配式排序”&#xff08;distribution sort&#xff09;&#xff0c;又称“桶子法”&#xff08;bucket sort&#xff09;或bin sort&#xff0c;顾名思义&#xff0c;它是透过键值的部份资讯&#xff0c;…

【Windows逆向】Windows进程动态patch入门+pyqt5搭建GUI

目标 希望学习对Windows进程的动态patch&#xff0c;我们选择的exe是buuoj的“不一样的flag”。这题是迷宫题的hello world&#xff0c;没有加壳&#xff0c;没有任何代码混淆&#xff0c;且可以把它当成一个超小型的游戏&#xff0c;有助于提升信心。 为了直观&#xff0c;以…

【学习笔记】SAP固定资产的减值功能

SAP固定资产的减值功能 若固定资产出现减值迹象&#xff0c;也就是固定资产的可收回金额小于账面价值时&#xff0c;就要计提固定资产减值准备。 分录&#xff1a; 借&#xff1a;资产减值损失&#xff08;损益科目&#xff09; 贷&#xff1a;固定资产减值准备&#xff08;资…

软件测试 | APP测试 —— Appium 的环境搭建及工具安装教程

推荐阅读&#xff1a; [内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ Python自动化测试全栈性能测试全栈&#xff0c;挑战年薪40W 从功能测试进阶自动化测试&#xff0c;熬夜7天整理出这一份超全学习指南【附网盘资源】 大家应该都有同一种感觉&…

传奇怎么设置GM帐号GM命令

传奇怎么设置GM帐号GM命令 我们先创建账号进入游戏 进入到服务器里面打开我的电脑 计算机D:\Mirserver\Mir200\Envir打开AdminList.txt文件 退出保存文本&#xff0c;小退一下游戏再次进入就是GM号了 方法二&#xff1a;在任务栏找到M2Server 点击查看-----列表信息一 保存后我…

微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.6 TCC 模式原理

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式事务 文章目录微服务框架分布式事务38 动手实践38.6 TCC 模式原理38.6.1 TCC 模式原理38.6.2 举个栗子38.6.3 工作流程38.6.4 总结38 …

TensoRT—— buffers管理(samplesCommon::BufferManager)

BufferManager类处理主机和设备buffer分配和释放。 这个RAII类处理主机和设备buffer的分配和释放、主机和设备buffers之间的memcpy以帮助inference&#xff0c;以及debugging dumps以验证inference。BufferManager类用于简化buffer管理以及buffer和 engine之间的交互。 代码位…

web前端网页制作课作业:校园科技节活动网站 (纯HTML+CSS布局制作)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

cleanmymac x免费版安装包下载使用教程

我这台用了7年的MacBook Air &#xff0c;硬盘容量只有 128G &#xff0c;用段时间就会被系统提醒「您的磁盘几乎已满」&#xff0c;并且变得有点卡顿。这时&#xff0c;清理一下垃圾&#xff0c;腾出更多储存空间&#xff0c;就能让它满血复活。 这个时候我们可以用 CleanMyM…

Kafka系列之:使用kafka manager增加topic分区和副本

Kafka系列之:使用kafka manager增加topic分区和副本) 一、相关技术博客二、增加分区三、增加副本一、相关技术博客 Kafka系列之:实现kafka topic优先副本的选举Kafka系列之:使用Kafka Manager实现leader分区平衡和broker节点上分区平衡二、增加分区 增加分区: 增加完分区…

Adobe Acrobat 图标异常的解决办法

今天使用 Adobe Acrobat 打开文件阅读时&#xff0c;发现底部任务栏的图标是这样的&#xff0c;如下图所示。 这可不是常见的 Adobe Acrobat 图标&#xff0c;肯定是哪里出了问题&#xff0c;于是我在电脑开始这里找到 Adobe Acrobat 的快捷方式&#xff0c;其图标也是这样的&…