Thymeleaf学习

Thymeleaf简介

前两天学习springboot遇到了thymeleaf,本着不懂就学的原则,网上查资料了解了以下,整理了一些网上的大家整理的资料,做一下记录。
Thymeleaf(读音)是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发。它是一个开源的Java库,基于Apache License 2.0许可,由Daniel Fernández创建,该作者还是Java加密库Jasypt的作者。
Thymeleaf提供了一个用于整合Spring MVC的可选模块,在应用开发中,你可以使用Thymeleaf来完全代替JSP或其他模板引擎,如Velocity、FreeMarker等。Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板。相对于编写逻辑或代码,开发者只需将标签属性添加到模板中即可。接下来,这些标签属性就会在DOM(文档对象模型)上执行预先制定好的逻辑。以上内容引用至这位大神的博客
示例模板(摘自官网):

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <title>Good Thymes Virtual Grocery</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <link rel="stylesheet" type="text/css" media="all" 
          href="../../css/gtvg.css" th:href="@{/css/gtvg.css}" />
  </head>
  <body> 
    <p th:text="#{home.welcome}">Welcome to our grocery store!</p> 
  </body>
</html>

Thymeleaf的优势

摘至https://blog.csdn.net/u011244202/article/details/54605165

  1. Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果。(当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。)
  2. Thymeleaf 开箱即用的特性。(它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果。)
  3. Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能。

另外,Thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发。它是一个开源的Java库,基于Apache License 2.0许可,由Daniel Fernández创建,该作者还是Java加密库Jasypt的作者。

SpringBoot引用Thymeleaf

  • 引入下面的依赖
  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
  </dependency>
  • control层代码
package com.banana.sprintbootday1.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {

    @RequestMapping("/demo2")
    public String demo1(Model map) {
        map.addAttribute("MyName","Fanco");
        return "index";
    }
}
  • index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"><!--引入thymeleaf-->
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 th:text="${MyName}">Hello World</h1>
</body>
</html>

直接打开页面的话显示的是helloworld,如果启动项目访问的话,显示MyName的值。

Thymeleaf 的配置

thymeleaf可以在项目的application.properties中进行配置

# 是否开启模板缓存,默认true
spring.thymeleaf.cache=true 
# 检查模板位置是否存在
spring.thymeleaf.check-template-location=true 
# Content-Type value
spring.thymeleaf.content-type=text/html 
# 是否启用MVC-Thymeleaf视图
spring.thymeleaf.enabled=true 
# 模板编码
spring.thymeleaf.encoding=UTF-8 
# 应该从解析中排除的视图名称列表(用逗号分隔)
spring.thymeleaf.excluded-view-names= 
# 要应用于模板的模板模式。另请参见StandardTemplateModeHandlers。
spring.thymeleaf.mode=HTML5 
# 在链接网址时预先查看名称的前缀。
spring.thymeleaf.prefix=classpath:/templates/ 
# 链接网址时附加到视图名称的后缀。
spring.thymeleaf.suffix=.html
# 指定模板的解析顺序,默认为第一个.
spring.thymeleaf.template-resolver-order= 
# 指定使用模板的视图名,多个以逗号分隔
spring.thymeleaf.view-names= 

Thymeleaf的用法

文本、字面值和国际化文本

文本

文本需要th:text属性来设置。我们可以在文本元素中添加默认值,这样当Thymeleaf引擎处理失败的时候页面会显示默认值。${...}是变量表达式,将括号中的变量替换为其值。

<p th:text="${hello}">你好<p>

字面值

在th:text中我们可以使用各种字面值,下面列举如下。

  • 字符串字面值。如果需要连接多个字符串使用+即可。
<span th:text="'字符串字面值需要用单引号包括'">默认值</span>
  • 数字字面量。我们可以使用运算符计算数字的值。
<span th:text="2012 + 5">2017</span>
  • 布尔值字面量。
<p th:text="true==true"></p>

国际化文本

默认情况下,我们可以在与视图文件相同的目录下编写properties文件,然后使用消息语法#{home.welcome}来引用文件中的字符串。可以有多个属性文件,对应不同的区域,例如home_en.properties代表英文区域,home_es.properties代表西班牙区域。下面是一个示例属性文件。

home.welcome=你好

默认情况下Thymeleaf会在与视图相同的文件下寻找同名的属性文件来加载消息。我们也可以自定义消息解析器,用自己的策略从任何地方加载消息。

内插字符串

内插字符串可以将一个字符串中给定部分替换为实际的字符串,内插字符串使用|包括,在|中只能包括${}表达式,不能包括其他表达式

<span th:text="|你好,${name}!|">
<span th:text="‘你好,+’${name}'+'!'">

算术、比较和逻辑运算

thymeleaf支持常用的算术运算,如果使用除/或者取余%运算符的话,还可以使用div或mod代替。

<p th:text="(17%5)-2"></p>
对于比较和逻辑运算符使用gt(>),ge(>=),le(<=),not(!),eq(==),neq/ne(!=)
<p th:text="1 gt 2"></p>

条件表达式

<p th:text="true?'真':'假'"></p>

无操作标记

<p th:text="_">不进行任何操作</p>

选择表达式(星号语法)

星号表达式和美元表达式的作用都是求变量的值。不过它们之间有一些区别,星号表达式作用于被选择的对象。被选择的对象需要使用th:object指定。下面是Thymeleaf的一个例子。

  <div th:object="${session.user}">
    <p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
    <p>Surname: <span th:text="*{lastName}">Pepper</span>.</p>
    <p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
  </div>

等效于使用${..}。

<div>
  <p>Name: <span th:text="${session.user.firstName}">Sebastian</span>.</p>
  <p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
  <p>Nationality: <span th:text="${session.user.nationality}">Saturn</span>.</p>
</div>

当存在选择对象的时候,我们可以使用美元表达式${#object}来访问选择对象,也可以同时使用星号表达式和美元表达式。选择表达式的主要作用是在表达式比较长例如${session.users.address.street.fullname}的时候,简化表达式。

选择块

条件选择块

在开发Web程序的时候, 很常见的需求就是根据某个值的真假,显示或隐藏某个HTML元素。这可以使用th:if="${exp}"实现。需要注意和JSTL中的<c:if>不同,Thymeleaf会根据条件显示或隐藏包含th:if的整个标签块,而不仅是它的子标签块。

<div th:if="true">....</div>

需要注意th:if的表达式不仅支持Java式的纯条件判断,还支持C语言式的真值判断,即当一个变量不为空或者整数不是0的时候,也认为是真值。另外还有一个th:unless执行和th:if相反的判断。

多重选择块

如果需要多重选择,可以使用th:switch。需要注意一旦有一个子条件匹配,Thymeleaf就不会继续检查其他条件了。如果需要提供默认值的话,可以这样写,th:case="*"

<div th:switch="${number}">
  <p th:case="1'">这是1</p>
  <p th:case="2">这是2</p>
  <p th:case="*">其他值</p>
</div>

迭代块

有时候我们需要遍历一个数组中的元素。这可以使用th:each实现。在th:each中我们要指定迭代元素和被迭代集合。被迭代集合可以是:数组,任何实现了java.util.Iterable的对象,任何实现了java.util.Enumeration的对象,任何实现了java.util.Iterator的对象,任何实现了java.util.Map的对象。需要注意的是,和JSTL的<c:forEach>标签不同,Thymeleaf会迭代包含<th:each>的整个标签块,而不仅仅是它的子标签块。

      <tr th:each="user : ${users}">
        <td th:text="${user.name}"></td>
        <td th:text="${user.age}"></td>
        <td th:text="${user.birthday}"></td>
      </tr>

Thymeleaf还提供了迭代状态变量来检测当前迭代的状态,只需要在th:each中声明iterStat即可。假如没有显式声明状态变量,Thymeleaf也会创建一个状态变量,名称是迭代元素添加后缀Stat。上面的代码中,Thymeleaf会创建一个名为userStat的状态变量。

      <tr th:each="user,iterStat : ${users}">
        <td th:text="${user.name}"></td>
        <td th:text="${user.age}"></td>
        <td th:text="${user.birthday}"></td>
      </tr>

状态变量包含以下属性;

  • index属性,以0开始的迭代元素索引。
  • count属性,以1开始的迭代元素索引。
  • size属性,迭代集合的总元素数。
  • iter属性,当前迭代元素。
  • even和odd两个布尔值,表明当前index的奇偶。
  • first和last两个布尔值,表明当前元素是否是第一个/最后一个。

删除代码段

以下是Thymeleaf的一个例子。我们可以使用th:remove来删除指定的部分,这在原型设计和调试的时候很有用。

 <tr th:remove="all">
    <td>Mild Cinnamon</td>
    <td>1.99</td>
    <td>yes</td>
    <td>
      <span>3</span> comment/s
      <a href="comments.html">view</a>
    </td>
  </tr>

th:remove可接受的值有5个:

  • all: 移除标签和所有子元素
  • body: 移除所有子元素,保留标签
  • tag: 移除标签,保留子元素
  • all-but-first: 保留第一个子元素,移除所有其他
  • none : 什么也不做。这个值在动态求值的时候会有作用

以下内容来自于https://blog.csdn.net/u011054333/article/details/55260754,我只记录了比较常用的,要知道更多可以去这看,或者看官方文档。

更多详细内容建议参考官方文档https://www.thymeleaf.org/documentation.html

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容