Thymeleaf 基本使用

01、Thymeleaf

      官网地址:Thymeleaficon-default.png?t=N7T8https://www.thymeleaf.org/

简介

        Thymeleaf是一种服务器端Java模板引擎,用于将数据渲染为HTML、XML、JavaScript等格式,并在Web浏览器中呈现给用户。 具体来说,Thymeleaf充当着视图层的角色,与控制器和模型一起构成了典型的MVC(模型-视图-控制器)设计模式中的视图部分。 Thymeleaf模板引擎允许我们在模板中使用HTML标记、JavaScript表达式和Thymeleaf表达式等,以动态地生成Web页面。Thymeleaf提供了一些特殊的属性和标签,以支持与控制器和模型之间的数据绑定和交互。
      相比于传统的前端技术(如HTML、CSS和JavaScript),Thymeleaf更注重后端的处理逻辑和数据交互。Thymeleaf能够从服务器端动态地生成页面,这意味着我们可以将服务器端的数据直接渲染到页面上,从而减少了大量的前端开发工作。同时,由于Thymeleaf能够与后端Java代码无缝集成,因此我们可以很方便地使用Java提供的各种类库和框架,进一步简化了开发工作。

为什么使用thymeleaf ?

    因为jsp页面存在劣势,它的本质是Servlet,还是一个类,只要是类就离不开JVM。我们无法通过浏览器直接查看JSP页面的效果,这不便于前端页面的实现。
    替代JSP:
        1、模板引擎,具备JSP的功能,但是比JSP更加强大,可以直接通过浏览器查看页面效果。
        2、前后端分离,Vue。

简介Thymeleaf 的特点

  • 动静结合:Thymeleaf 既可以直接使用浏览器打开,查看页面的静态效果,也可以通过 Web 应用程序进行访问,查看动态页面效果。
  • 开箱即用:Thymeleaf 提供了 Spring 标准方言以及一个与 SpringMVC 完美集成的可选模块,可以快速地实现表单绑定、属性编辑器、国际化等功能。
  •  SpringBoot 完美整合:SpringBoot  Thymeleaf 提供了的默认配置,并且还为 Thymeleaf 置了视图解析器,因此 Thymeleaf 可以与 Spring Boot 完美整合。
Thymeleaf 通过在 html 标签中,增加额外属性来达到模板+数据的展示方式:
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <p th:text="${username}">Original Value</p>
</body>
</html>

02、物理视图和逻辑视图

    2.1、物理视图

        请求转发到一个HTML页面时,使用的完整的转发路径就是物理视图。
            例如:/pages/user/index.html
        如果我们把所有的HTML页面都放在某个统一的目录下,那么转发地址就会呈现出明显的规律:
            /pages/user/login.html
            /pages/user/login_success.html
            /pages/user/regist.html
            /pages/user/regist_success.html
        规律:路径的开头都是:/pages/user/  ,路径的结尾都是:.html 
        所以,路径开头的部分我们称之为视图前缀,路径结尾的部分我们称之为视图后缀

    2.2、逻辑视图

        物理视图=视图前缀+逻辑视图+视图后缀
视图前缀
逻辑视图
视图后缀
物理视图
/pages/user/
login
.html
/pages/user/login.html
/pages/user/
login_success
.html
/pages/user/login_success.html

03、Thymeleaf 语法

3.1、引入命令空间

       
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Index Page</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <p th:text="${message}">Welcome to BeiJing!</p>
</body>
</html>
注意:‘xmlns:th="http://www.thymeleaf.org"’引入Thymeleaf命名空间。

3.2、常用标签

     

     3.2.1、th:text 

       作用:替换标签的文本原始值。
<!-- 使用【字面量值】替换标签体原始值-->
<h1 th:text="HelloWorld">标签体原始值</h1>
<!-- 使用域中数据替换标签体原始值 -->
<h1 th:text="${username}">这里要显示一个动态的username</h1>

     3.2.2、th:属性名

        作用:替换指定属性的属性值
<input type="text" name="username" th:value="${username}"/>

3.3、常用表达式

语法
描述
作用
${...}
变量表达式
变量表达式 是最常用的一种表达式,它主要可以获取变量的值。
*{...}
选择表达式
消息表达式 主要是用于读取属性文件(.properties)中的值,它常常用于国际化。
#{...}
消息表达式
选择表达式 我们也称为是星号表达式,它与 变量表达式 的区别是:变量表达式 的对象取的是整个上下文中的变量,而 选择表达式 的对象取的是当前对象中的变量。这样做的好处是只需要在当前对象中取,不需要通过上下文去取,在一定程度上提高了执行效率,这也是性能上的一种优化。
@{...}
链接表达式
链接表达式 主要在页面中有链接的地方使用。
~{...}
分段表达式
分段表达式 主要用于模板布局时的引用。也就是在一个页面中引入另一个页面中的内容。

     3.3.1、案例

    
    1)、变量表达式
<!-- 获取 name 变量的值 -->
<p th:text="${name}"></p>
    2)、选择表达式
<!-- book 中从上下文中取的一个变量 -->
<div th:object="${book}">
<!-- title 是 book 中的属性 -->
<span th:text="*{title}"></span> </div>
    其中 th:object 的意思是:用来接受后台传过来的对象。
    3)、消息表达式
<!-- 读取属性文件中 key 为 name 的值 -->
<p th:text="#{name}"></p>
    
    注意: 我们必须先要配置属性文件所在位置,在项目配置文件中配置以下内容:
spring:
    messages:
        basename: msg
    4)、链接表达式
<a th:href="@{/result}">...</a>
<!--整个页面 href和src属性的标签自动拼接项目地址  http://ip:端口/项目名/ -->
<base th:href="@{/}" th:src="@{/}">
    5)、分段表达式
    首先我们准备两个页面,分别是 result.html 和 foot.html,我们在 result.html 中引入 foot.html 的内容。
    result.html
<body>
    <p>这是 result.html 页面</p>
    <div th:insert="~{foot :: copy}"></div>
</body>
    foot.html
<body>
    <div th:fragment="copy">
        &copy; 2020 <a href="http://www.baidu.com">百度</a>
    </div>
</body>

3.4、内置对象

    
    所谓内置对象其实就是在Thymeleaf的表达式中可以直接使用的对象。
基本对象:
对象
描述
#ctx
上下文对象
#vars
同#ctx,表示上下文变量
#locale
上下文本地化(特定的地理区域)变量,可参考:java.util.Locale
#request
HttpServletRequest 对象,可参考:javax.servlet.http.HttpServletRequest
#response
HttpServletResponse 对象,可参考:javax.servlet.http.HttpServletResponse
#session
HttpSession 对象,可参考:javax.servlet.http.HttpSession
#servletContext
ServletContext 对象,可参考:javax.servlet.ServletContext
工具类对象:
对象
描述
#dates
日期时间工具类
#strings
字符串工具类
#lists
List集合工具类
#numbers
数字工具类
#calendars
日历工具类
#objects
对象工具类
#bools
布尔工具类
#arrays
数组工具类
#sets
Set工具类
#maps
Map工具类
处理空值, 通过加问号来判断前面的值是否为空,防止报错。
<p th:text="${data?.name}"></p>
示例:
    #ctx
<!-- zh_CN -->
<p th:text="${#ctx.getLocale()}"></p>
<!-- Welcome to BeiJing! -->
<p th:text="${#ctx.getVariable('message')}"></p>
<!-- true -->
<p th:text="${#ctx.containsVariable('message')}"></p>
    #vars
<!-- zh_CN -->
<p th:text="${#vars.getLocale()}"></p>
<!-- Welcome to BeiJing! -->
<p th:text="${#vars.getVariable('message')}"></p>
<!-- true -->
<p th:text="${#vars.containsVariable('message')}"></p>
    #locale
<!-- zh_CN -->
<p th:text="${#locale}"></p>
<!-- CN -->
<p th:text="${#locale.country}"></p>
<!-- 中国 -->
<p th:text="${#locale.displayCountry}"></p>
<!-- zh -->
<p th:text="${#locale.language}"></p>
<!-- 中文 -->
<p th:text="${#locale.displayLanguage}"></p>
<!-- 中文 (中国) -->
<p th:text="${#locale.displayName}"></p>
    #request
<!-- HTTP/1.1 -->
<p th:text="${#request.protocol}"></p>
<!-- http -->
<p th:text="${#request.scheme}"></p>
<!-- localhost -->
<p th:text="${#request.serverName}"></p>
<!-- 8080 -->
<p th:text="${#request.serverPort}"></p>
<!-- GET -->
<p th:text="${#request.method}"></p>
<!-- /standard-expression-syntax/variables -->
<p th:text="${#request.requestURI}"></p>
<!-- http://localhost:8080/standard-expression-syntax/variables -->
<p th:text="${#request.requestURL}"></p>
<!-- /standard-expression-syntax/variables -->
<p th:text="${#request.servletPath}"></p>
<!-- java.util.Collections$3@203646fe -->
<p th:text="${#request.parameterNames}"></p>
<!-- {q=[Ljava.lang.String;@3308c69f} -->
<p th:text="${#request.parameterMap}"></p>
<!-- q=expression -->
<p th:text="${#request.queryString}"></p>
    注意,请求地址的 URL 参数直接通过#request.x是取不出来的,需要使用param.x语法来取出。如,URL:/standard-expression-syntax/variables?q=expression,取出 q 参数的正确方式:
<p th:text="${param.q}"></p>
    #response
<!-- 200 -->
<p th:text="${#response.status}"></p>
<!-- 8192 -->
<p th:text="${#response.bufferSize}"></p>
<!-- UTF-8 -->
<p th:text="${#response.characterEncoding}"></p>
<!-- text/html;charset=UTF-8 -->
<p th:text="${#response.contentType}"></p>
    #session
<!-- 2BCB2A0EACFF2D9D249D9799431B5127 -->
<p th:text="${#session.id}"></p>
<!-- 1499786693244 -->
<p th:text="${#session.lastAccessedTime}"></p>
<!-- fanlychie -->
<p th:text="${#session.getAttribute('user').name}"></p>
    注意,放到会话里面的对象直接通过#session.x是取不出来的,需要使用session.x语法来取出。如,取出会话里面的 user 对象的正确方式:
<p th:text="${session.user.name}"></p>
    #dates
<!--2022年9月18日 GMT+08:00 下午1:40:48-->
<p th:text="${#dates.format(myDate)}"></p>
<!--2022-09-18-->
<p th:text="${#dates.format(myDate, 'yyyy-MM-dd')}"></p>
<!--2022-09-18 13:40:48-->
<p th:text="${#dates.format(myDate, 'yyyy-MM-dd HH:mm:ss')}"></p>
<!--2022-->
<p th:text="${#dates.year(myDate)}"></p>
<!--9-->
<p th:text="${#dates.month(myDate)}"></p>
<!--Sun Sep 18 13:40:49 GMT+08:00 2022-->
<p th:text="${#dates.createNow()}"></p>
    #strings
<!--HELLO WORLD-->
<p th:text="${#strings.toUpperCase(myStr)}"></p>
<!--2-->
<p th:text="${#strings.indexOf(myStr,'ll')}"></p>
<!--llo-->
<p th:text="${#strings.substring(myStr, 2, 5)}"></p>
<!--hello worldJava-->
<p th:text="${#strings.concat(myStr, 'Java')}"></p>
<!--11-->
<p th:text="${#strings.length(myStr)}"></p>
<!--5-->
<p th:text="${#strings.length('happy')}"></p>
<!--true-->
<p th:text="${#strings.contains(myStr, 'hello')}"></p>
    #lists
<!--3-->
<p th:text="${#lists.size(myList)}"></p>
<!--true-->
<p th:text="${#lists.contains(myList, 1)}"></p>
<!--false-->
<p th:text="${#lists.isEmpty(myList)}"></p>
<!--[1, 2, 3]-->
<p th:text="${#lists.sort(myList)}"></p>
    #numbers
<!--¥12.25-->
<p th:text="${#numbers.formatCurrency(myNumber)}"></p>
<!--0012.2-->
<p th:text="${#numbers.formatDecimal(myNumber, 4, 1)}"></p>

3.4、字符串拼接

     在Thymeleaf中,可以使用+运算符进行字符串拼接。例如:
<p th:text="'Hello, ' + ${user.name} + '!'">默认问候</p>

3.5、条件比较

     Thymeleaf支持常见的条件比较,如==、!=、<、>等。例如:
<div th:if="${user.age} > 18">成年用户</div>

3.6、switch多分支

     Thymeleaf支持switch语句,用于多分支条件判断。例如:
<div th:switch="${user.role}">
    <p th:case="'admin'">管理员</p>
    <p th:case="'user'">普通用户</p>
    <p th:case="*">未知角色</p>
</div>

3.7、循环

     Thymeleaf支持th:each属性,用于遍历集合。例如:
<ul>
    <li th:each="item : ${items}" th:text="${item.name}">默认列表项</li>
</ul>

3.8、逻辑运算符

     在Thymeleaf中,我们可以使用加(+)、减(-)、乘(*)、除(/)和取余(%)等基本算术运算符来进行数值计算。这些运算符的使用方法与传统的编程语言类似,可以直接应用在表达式中,实现数值的加减乘除等操作。 例如:
<p th:text="${user.age} + 1">年龄加一</p>

3.9、内联

    Thymeleaf支持内联表达式,用于在文本和属性中直接插入表达式。这种表达式允许我们在文本内容和HTML属性中直接插入动态数据,从而实现页面内容的灵活定制。例如:
<p>你好,[[${user.name}]]!</p>

04、Thymeleaf 与 springboot整合

    

    4.1、导入依赖

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

    4.2、页面引入命名空间

xmlns:th="http://www.thymeleaf.org"
到这里页面就可以使用thymeleaf的语法,注意:页面要经过控制器。

    4.3、静态资源项目名直接访问

    添加配置
#开放静态资源目录,这个配置目录会覆盖默认配置:"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"
spring:
    resources:
      static-locations: classpath:/static/,file:${file.dir}
#资源目录
file:
  #资源根目录
  dir: D:/data
    这样D盘的data目录下的资源直接可以使用:http://IP地址:端口/资源名

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

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

相关文章

C语言 ——注释

1.1 单行注释 - 语法&#xff1a;// 待注释的内容 - 位置&#xff1a;可放在代码后&#xff0c;称之为行尾注释&#xff1b; 也可放代码上一行&#xff0c;称作行上注释。 c // 这是单行注释文字 1.2 多行注释 - 语法&#xff1a;/* 待注释的内容 */ - 注意&#xff1a;多⾏…

考研C语言复习进阶(1)

目录 1. 数据类型介绍 1.1 类型的基本归类&#xff1a; 2. 整形在内存中的存储 2.1 原码、反码、补码 2.2 大小端介绍 3. 浮点型在内存中的存储 ​编辑 1. 数据类型介绍 前面我们已经学习了基本的内置类型&#xff1a; char //字符数据类型 short //短整型 int /…

前端之用HTML弄一个古诗词

将进酒 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>将进酒</title><h1><big>将进酒</big> 君不见黄河之水天上来</h1><table><tr><td ><img…

借助ChatGPT提高编程效率指南

PS: ChatGPT无限次数&#xff0c;无需魔法&#xff0c;登录即可使用,网页打开下面 一、借助ChatGPT提高编程效率指南 随着计算机技术的飞速发展&#xff0c;编程已经成为了现代社会中一个非常重要的技能。对于许多人来说&#xff0c;编程不仅是一项工作技能&#xff0c;而且是…

操作系统系列学习——操作系统之“树”

文章目录 前言操作系统之“树” 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感谢 【哈…

sqllab第五关通关笔记

知识点&#xff1a; 报错注入函数语法&#xff08;详见第二关笔记&#xff09;报错注入打印位数最多32位对于大于32位的数据最好使用截取函数进行控制&#xff1b;以保证输出完整mysql表中的重点数据库 information_schema &#xff08;mysql 5.0以上&#xff09; schemata …

每日一题 — 长度最小的子数组

LCR 008. 长度最小的子数组 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 首先在暴力枚举的方法下&#xff0c;我们可以进行优化&#xff0c;让right不用从头开始&#xff0c;只需让left移动&#xff0c;进行判断。然后就是变成了同向双指针&#xff0c;也就是滑…

责任链模式-C#实现

责任链模式指的是——某个请求需要多个对象进行处理&#xff0c;从而避免请求的发送者和接收之间的耦合关系。 将这些对象连成一条链子&#xff0c;并沿着这条链子传递该请求&#xff0c;直到有对象处理它为止。 主要涉及两个角色&#xff1a; 抽象处理者角色&#xff08;Hand…

【测试开发学习历程】Linux用户管理+文件权限管理

目录 一、用户管理 &#xff08;一&#xff09;用户和用户组的基本概念 1.概念 2.设置原因 3.用户与用户组的关系 4.用户类型 &#xff08;二&#xff09;用户的创建、修改属性和删除用户 1.用户信息文件 2.创建用户 3.修改用户密码 4.修改用户信息 5.用户查询 6.…

MAMP Pro 站点404 Nginx 配置

MAMP Pro 站点配置 if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s/$1 last;break; }

第十四届蓝桥杯C++B组编程题题目以及题解

a.冶炼金属&#xff08;二分&#xff09; 思路&#xff1a; 设任意一条冶炼记录投入金属数量为a,产出金属为b. 对于每一条冶炼记录我们都可以得到 一个转换率V的范围&#xff1a; b<a/v<b1即a/b< v <a/(b1) 为什么是b1呢&#xff1f;因为既然能产出b个金属&#xf…

实现的一个网页版的简易表白墙

实现的一个网页版的表白墙 实现效果 代码截图 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><tit…

【Java】初级篇:基本语法

一、变量与运算符 标识符命名规则 由26个英文字母大小写、0-9、_或$组成&#xff1b;不可以以数字开头&#xff1b;不能单用关键字和保留字&#xff1b;区分大小写&#xff1b;不包含空格。 【包名&#xff1a;所有字母小写|类名、接口名&#xff1a;多单词组成时所有字母首字…

1.6数组

一.序言 数组是一组类型相同类型元素的集合&#xff0c;数组的定长的&#xff08;数组的长度一旦被定义&#xff0c;长度不可改变&#xff09;。 数组在内存当中是一块连续的空间&#xff0c;可以保存相同类型的多个元素。 二.一维数组 2.1.数组的创建 int arr1[10]; …

Android的UI渲染机制(一)

应用程序与Surface的关系&#xff0c;从应用程序的Activity开始&#xff0c;一路追踪到ViewRoot、WindowManager Service。 SurfaceFlinger则主要负责视图的显示&#xff0c;其管理多个surface进行图像合成。WindowManager Service由System_Server进程启动&#xff0c;SurfaceF…

IDEA 设置信息及插件同步配置

所需插件&#xff1a; 第一步&#xff1a;打开登录界面&#xff0c;进行登录 第二步&#xff1a;再次点击

Go——运算符,变量和常量,基本类型

一.运算符 Go语言内置的运算符有&#xff1a; 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 1.1 算术运算符 注意&#xff1a;(自增)和--(自减)在go语言中是单独的语句&#xff0c;并不是运算符。 1.2 关系运算符 1.3 逻辑运算符 1.4 位运算符 位运算符对整数在内存…

【Linux】Linux小结

LVS、Nginx、HAproxy的区别 LVS、Nginx和HAproxy都是常见的负载均衡器&#xff0c;用于将网络负载分散到多个服务器上&#xff0c;以提高系统的可用性和性能 功能不同&#xff1a; LVS是一个Linux内核模块&#xff0c;在网络层&#xff08;第四层&#xff09;运行的。 Nginx和…

基于springboot+vue实现药品信息管理系统项目【项目源码+论文说明】计算机毕业设计

基于springbootvue实现药品信息管理系统演示 摘要 本文介绍了一种基于SpringBoot的药品信息管理系统的设计与实现。该系统旨在提高药品管理的效率和准确性&#xff0c;包括药品信息的录入、修改、查询和删除、药品入库、出库等功能。该系统采用了SpringBoot框架、MySQL数据库、…

[GPU]2.编译.cu文件

在编译.cu文件的时候&#xff0c;需要先确定自己已经安装了CUDA&#xff0c;并将其配置到系统环境中。 当然这个的前提是——你的显卡得是nvida的&#xff0c;你才能安装这个工具 如果你完成了这些的话&#xff0c;编译.cu文件就比较容易了&#xff0c;比如这个文件&#xff…