thymeleaf基础语法

thymeleaf学习笔记

简单表达式

  • ${...} 变量表达式; 变量值的替换,可以简单理解为后端注入到前端的变量值
<div>
    <p>Name: <span th:text="${session.user.firstname}">Sebastian</span></p>
</div>
  • *{...} 选择变量表达式;对比变量表达式,选择变量表达式优先选择指定的变量,若没有指定,则和变量表达式完全一致
<div th:object="${session.user}">
    <p>Name: <span th:text="*{firstname}">Sebastian</span></p>
</div>
  • {...} 消息表达式;从属性文件中获取的值替换html文件中的占位符号

<p th:utext="#{home.welcome}">Welcome to our grocery store ! </p>
  • @{...} 链接url表达式;
<a th:href="@{'/details/'+${user.login}(orderId=${o.id})}">view</a>
<a th:href="@{~/tmp/logfile}">logfile</a>

文字类型

  • 字符型: ‘one text’ , ‘Another one!’
  • 数值型: 0 , 34 , 3.0 , 12.3
  • Boolean型: true , false
  • 空值: null
  • 文本字符串: one , sometext , main

字符串操作

  • 字符串连接: +
<span th:text="'The name of the user is ' + ${user.name}">
  • 文字替换: |The name is ${name}|
<span th:text="|The name of the user is  ${user.name}|">
  • 内联表达式:[[...]]

数值型操作:

  • 运算符: + , - , * , / , %
  • 负号: -
  • Boolean操作:
  • 运算符: and , or
  • 非运算符: ! , not
  • 比较相等算法:
  • 比较: > , < , >= , <= ( gt , lt , ge , le )
  • 相等算法: == , != ( eq , ne )

条件语句:

  • If-then: (if) ? (then)
<body>
    <div th:if="${age} > 20">
        大于 20
    </div>
    <div th:unless="${age} > 20">
        小于 20
    </div>
</body>
  • If-then-else: (if) ? (then) : (else)
<tr th:class="${row.even} ? 'even' : 'odd'">error</tr>
  • switch
<div th:switch="${role}">
    <p th:case="user">User</p>
    <p th:case="${admin}">Admin</p>
    <p th:case="*">Unknown</p>
</div>

循环

  • each
<ul>
    <li th:each="animal : ${animals}" th:text="${animal}">小动物 - 此处文本会被覆盖</li>
</ul>

模版语法

  • 定义模版片段
<div th:fragment="copy">
      &copy; 2011 The Good Thymes Virtual Grocery
    </div>
  • 引入模版
<div th:insert="~{footer :: copy}"></div>
<div th:replace="~{footer :: copy}"></div> 
<div th:include="~{footer :: copy}"></div>
  • 三种不同的各式
  • ~{templatename::selector},指定选择器selector的模版
  • ~{templatename},整个模版
  • ~{::selector} ,同一模版中匹配指定的选择器片段
  • 删除模版
<tbody th:remove="all-but-first"></tbody>
  • 5种不同的删除方式
  • all : 删除所有
  • body: 不删除包含的标签,删除所有的子项
  • tag: 删除包含的标签,但是不删除子项
  • all-but-first:除第一个子项不删除,其他均删除
  • none: 什么都不干

工具类

  • execInfo: 有关正在处理模版的信息
  • messages: 变量表达式中获取外部化消息的方法,和#{…}语法获得的方式相同.
  • uris: 转义URL/URI的方法
  • conversions: 配置转换相关的方法
  • dates: java.util.date对象的方法: 格式化,组件提取.
  • calendars: 类似dates,calendar对象相关.
  • numbers: 用户格式化数字对象的方法.
  • strings: methods for String objects: contains, startsWith, prepending/appending, etc.
  • objects: methods for objects in general.
  • bools: methods for boolean evaluation.
  • arrays: methods for arrays.
  • lists: methods for lists.
  • sets: methods for sets.
  • maps: methods for maps.
  • aggregates: methods for creating aggregates on arrays or collections.
  • ids: methods for dealing with id attributes that might be repeated (for example, as a result of an iteration).

其他

  • 基础语法之间都可以任意嵌套
'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))
  • 默认表达式
<div th:object="${session.user}">
  ...
  <p>Age: <span th:text="*{age}?: '(no age specified)'">27</span>.</p>
</div>
  • 哑操作符,(_)表示不处理任何结果
<div th:object="${session.user}">
  ...
  <p>Age: <span th:text="*{age}?-: '(no age specified)'">27</span>.</p>
</div>
  • 数据类型转换; 变量/选择表达式的一个双括号语法,调用注册的转换服务,默认调用对象的toString方法
  • 懒加载,条件表达式为false,被迭代变量永远不会被初始化
context.setVariable(
     "users",
     new LazyContextVariable<List<User>>() {
         @Override
         protected List<User> loadValue() {
             return databaseRepository.findAllUsers();
         }
     });
context.setVariable(
     "users",
     new LazyContextVariable<List<User>>() {
         @Override
         protected List<User> loadValue() {
             return databaseRepository.findAllUsers();
         }
     });
  • 局部变量,th:with语法声明局部变量,只在包含的标签范围内使用

参考文档

  1. 官方文档

  2. thymeleaf基础语法

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

推荐阅读更多精彩内容