Thymeleaf 3.0 手册

Spring 官方推崇的模版引擎,遵循 HTML5规范。

HTML5

若要完全遵循HTML5规范,可使用 data-th-* 代替 th:*

标签

th:each

foreach 循环
语法: th:each=”obj, index:list”

1
2
3
4
5
6
7
8
<th:block th:each="permission, i:${role.permissions}">
<tr th:attr="data-tt-id=${permission.id}, data-tt-parent-id=${permission.parent}, data-tt-branch=${permission.hasChildren}">
<td th:text="${permission.name}"></td>
<td th:text="${permission.url}"></td>
<td th:text="${permission.type}"></td>
<td th:text="${permission.permission}"></td>
</tr>
</th:block>

th:inline

解析内嵌语法, 一般是混合javascript
语法: th:inline=”javascript|text|none”

1
2
3
4
5
6
<script th:inline="javascript">
/*<![CDATA[*/
var welcome = [[${welcome}]] '这是一个 Thymeleaf 变量';
var default_value = [[${maxCount?:0}]]
/*]]>*/
</script>

th:fragment

定义模版,语法: th:fragment=”模块名(变量)”
变量部分为可选, 配合 th:with 使用。

1
2
3
4
5
6
<!-- 不保留本身的标签, 保留 th:fragment 的标签 -->
<div th:replace="/admin/fragments/header::header"></div>
<!-- 保留本身的标签, 保留 th:fragment 的标签 -->
<div th:insert="/admin/fragments/header::header"></div>
<!-- @过期, 保留本身的标签, 不保留 th:fragment 的标签 -->
<div th:include="/admin/fragments/header::header"></div>

th:with

定义变量。语法: th:with=”字段1=值, 字段2=值2”

1
<div th:with="id='UploadImage',var='image',height=1,maxCount=1"></div>

th:if

就是 if ..

1
2
3
4
5
6
7
<div th:if="${true}"></div>
<!--
布尔值.
0 = false
"false"/"off"/"no" = false
null = false
-->

th:switch/th:case

1
2
3
4
5
<ul th:switch="${val}">
<li th:case="1">1</li>
<li th:case="2">2</li>
</ul>

th:selected

可用于

1
2
3
4
<select class="form-control" id="type" name="type">
<option value="0" th:selected="${permission?.type==0}">菜单</option>
<option value="1" th:selected="${permission?.type==1}">数据</option>
</select>

注释语法

1
2
3
4
5
6
7
8
9
10
<!--/* 这里是 编译器显示为注释, 浏览器不可见 */-->

<!--/*-->
<div>这里是 编译器显示不注释,浏览器不可见 </div>
<!--*/-->

<!--/*/
<div th:text="${'这里是 编辑器显示为注释, 浏览器可见'}">...</div>
/*/-->

表达式

URL 表达式

1
2
3
4
5
6
<img th:src="@{/img/tup.png}" alt="绝对路径">
<!-- <img alt="绝对路径" src="/img/tup.png"> -->
<img th:src="@{../img/tup.png}" alt="相对路径">
<!-- <img alt="相对路径" src="../img/tup.png"> -->
<img th:src="@{../img/tup.png(size=${100})}" alt="带参数的路径">
<!-- <img alt="带参数的路径" src="../img/tup.png?size=100"> -->

国际化表达式

  1. 创建 resources/messages_zh_CN.properties, 其内容:
1
message.error=错误
  1. 配置 application.yml (使用 xml 的执行转换)
1
2
3
spring:
messages:
basename: messages_zh_CN
  1. 使用
1
<div th:text="#{message.error}">Error</div> 

变量表达式

最基本的表达式, 类似于 EL 表达式。

  • org.springframework.ui.Model 使用。
  • 可以使用众多内置对象。
  • @访问 Spring 容器内对象
1
<span th:text="${author.name}">

变量表达式 - 扩展 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<ul th:object="${author}">
<li th:text="*{name}"></li>
<li th:text="*{mail}"></li>
<li th:text="*{address}"></li>
</ul>

<!--
等价于
<ul>
<li th:text="${author.name}"></li>
<li th:text="${author.mail}"></li>
<li th:text="${author.address}"></li>
</ul>
-->

变量表达式 - 扩展 2

1
<div th:text="${@demoService.getStr('hocgin')}"></div>

预处理表达式

  1. 前置设置, Controller
1
2
3
4
5
6
7
8
@GetMapping({"/test.html"})
public String index(Model model, @PathVariable String page) {
model.addAttribute("key", "error");
HashMap<String, String> vm = new HashMap<>();
vm.put("error", "来自 ${} 表达式");
model.addAttribute("obj", vm);
return String.format("test.html", page);
}
  1. 前置设置, messages_zh_CN.properties 参考国际化表达式
1
message.error=错误
  1. test.html 编写
1
2
3
4
5
6
<a th:href="@{/img/__${1+1}__}">连接</a>
<!-- <a href="/img/2">连接</a> -->
<div th:text="#{message.__${key}__}"></div>
<!-- <div>错误</div> -->
<div th:text="${obj.__${key}__}"></div>
<!-- <div>来自 ${} 表达式</div> -->

Fragment 表达式

~{…}

表达式语法

字符串拼接

使用 + 或者 |..|

1
2
3
4
<span th:text="'1+1=' + ${1+1}"></span>
<!-- 1+1=2 -->
<span th:text="|1+1=${1+1}|"></span>
<!-- 1+1=2 -->

运算符号

使用 +, -, *, /, %

1
2
<span th:text="-((1+1-1)*2/2)%9"></span>
<!-- -1 -->

与 或 非

使用 and , or! , not

1
2
3
4
5
6
7
8
9
10
11
12
<span th:text="1==1 and true"></span>
<!-- true -->
<span th:text="true and false"></span>
<!-- false -->

<span th:text="true or false"></span>
<!-- true -->

<span th:text="not true"></span>
<!-- false -->
<span th:text="! false"></span>
<!-- true -->

关系表达式

使用 >, <, >=, <=, ==, !=
或者 gt, lt, ge, le, eq, ne

1
2
3
4
<span th:text="((1 > 2 and 2 < 3) or (2 >= 2 and 2 <= 5)) and (1 == 1 and 1 != 2)"></span>
<!-- true -->
<span th:text="((1 gt 2 and 2 lt 3) or (2 ge 2 and 2 le 5)) and (1 eq 1 and 1 ne 2)"></span>
<!-- true -->

简单条件表达式

使用:
if-then (if) ? (then)
if-then-else (if) ? (then) : (else)
default (value) ?: (defaultValue)

1
2
3
4
5
6
<span th:text="true ? 'hocgin'"></span>
<!-- hocgin -->
<span th:text="false ? 'hocgin' : 'hocg.in'"></span>
<!-- hocg.in -->
<span th:text="${iname} ?: 'hocgin'"></span>
<!-- hocgin -->

解析优先级

级别 描述 th属性
1 (Fragment inclusion)代码片段导入 th:insert,th:replace
2 (Fragment iteration)迭代 th:each
3 (Conditional evaluation)条件 th:if,th:unless,th:switch,th:case
4 (Local variable definition)局部变量 th:object,th:with
5 (General attribute modification)通用属性修改 th:attr,th:attrprepend,th:attrappend
6 (Specific attribute modification)具体属性修改 th:value,th:href,th:src
7 (Text tag body modification) 文本节点修改 th:text,th:utext
8 (Fragment specification) 代码段定义 th:fragment
9 (Fragment removal) 代码段删除 th:remove

基础对象

#ctx (org.thymeleaf.spring4.context.SpringWebContext)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* org.thymeleaf.context.IContext
**/
// 当前语言环境(eg. en_US)。 等价于 {#locale}
${#ctx.locale}
// org.thymeleaf.context.VariablesMap 对象, 内部存储的是可用于当前上下文(Context)的对象。等价于 {#vars}
${#ctx.variables}

/**
* org.thymeleaf.context.IWebContext
**/
${#ctx.applicationAttributes}
// 等价于 {#httpServletRequest}
${#ctx.httpServletRequest}
${#ctx.httpServletResponse}
// 等价于 {#httpSession}
${#ctx.httpSession}
${#ctx.requestAttributes}
${#ctx.requestParameters}
${#ctx.servletContext}
${#ctx.sessionAttributes}

param (org.apache.catalina.util.ParameterMap)

包含当前页面的请求的参数(eg. http://localhost:8080/admin/test.html?name=hocgin)。

1
2
3
4
5
6
7
// 返回对象
${param.name}
// 获得值: hocgin
${param.name[0]}
${param.size()}
${param.isEmpty()}
${param.containsKey('name')}

session (org.thymeleaf.context.WebSessionVariablesMap)

从 Session 获取内容。

1
2
3
4
5
// 获得值: hocgin
${session.name}
${session.size()}
${session.isEmpty()}
${session.containsKey('name')}

#httpServletRequest (org.apache.catalina.connector.RequestFacade)

#themes (org.thymeleaf.spring4.expression.Themes)

application

#dates (org.thymeleaf.expression.Dates)

#calendars (org.thymeleaf.expression.Calendars)

#numbers (org.thymeleaf.expression.Numbers)

#strings (org.thymeleaf.expression.Strings)

#objects (org.thymeleaf.expression.Objects)

#bools (org.thymeleaf.expression.Bools)

#arrays (org.thymeleaf.expression.Arrays)

#lists (org.thymeleaf.expression.Lists)

#sets (org.thymeleaf.expression.Sets)

#maps (org.thymeleaf.expression.Maps)

#aggregates (org.thymeleaf.expression.Aggregates)

#messages (org.thymeleaf.expression.Messages)

#ids (org.thymeleaf.expression.Ids)

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
### `#locale` (<span th:text="${#locale}"></span>)<br>
### `#ctx` (<span th:text="${#ctx}"></span>)<br>
### `#vars` (<span th:text="${#vars}"></span>)<br>

### `param` (<span th:text="${param}"></span>)<br>
### `application` (<span th:text="${application}"></span>)<br>
### `session` (<span th:text="${session}"></span>)<br>
### `#httpSession` (<span th:text="${#httpSession}"></span>)<br>
### `#httpServletRequest` (<span th:text="${#httpServletRequest}"></span>)<br>

### `#themes` (<span th:text="${#themes}"></span>)<br>
### `#dates` (<span th:text="${#dates}"></span>)<br>
### `#calendars` (<span th:text="${#calendars}"></span>)<br>
### `#numbers` (<span th:text="${#numbers}"></span>)<br>
### `#strings` (<span th:text="${#strings}"></span>)<br>
### `#objects` (<span th:text="${#objects}"></span>)<br>
### `#bools` (<span th:text="${#bools}"></span>)<br>
### `#arrays` (<span th:text="${#arrays}"></span>)<br>
### `#lists` (<span th:text="${#lists}"></span>)<br>
### `#sets` (<span th:text="${#sets}"></span>)<br>
### `#maps` (<span th:text="${#maps}"></span>)<br>
### `#aggregates` (<span th:text="${#aggregates}"></span>)<br>
### `#messages` (<span th:text="${#messages}"></span>)<br>
### `#ids` (<span th:text="${#ids}"></span>)<br>

重点

  • thymeleaf 中使用 Spring 容器内的单例.
1
<div th:text="${@demoService.getStr('hocgin')}"></div>
  • 引入模版片段
  1. XPath 表达式

    1
    <div th:include="mytemplate :: [//div[@class='content']]"></div>
  2. CSS 表达式

    1
    <div th:include="mytemplate :: [div.content]"></div>
  • 引入公有片段(JS 或 CSS)
1
2
3
<css th:replace="mytemplate :: common-css"></css>
<js th:replace="@{mytemplate} :: common-css"></js>
<!-- 可结合 路径表达式 -->

扩展

thymeleaf-layout-dialect

一般情况网站都有一个外部框架, 如 header 或者 footer, 这个扩展便是用于抽离那些重复的部分的。

layout:decorator

指定需使用的父级模版

1
2
3
4
5
6
<html lang="en"
xmlns:th="http://www.thymeleaf.org"
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorator="/admin/_layouts/default">
...
</html>

layout:fragment

在父模版中使用定义一个标记,
在子模版中使用覆盖到父模版位置。

1
2
3
4
5
6
7
8
9
10
11
12
<!-- 父 -->
<div layout:fragment="content">
<p>父模版内容</p>
</div>
<!-- 子 -->
<div layout:fragment="content">
<p>子模版内容</p>
</div>
<!-- 生成 -->
<div>
<p>子模版内容</p>
</div>

layout:title-pattern

用与 标签, 指定 title 的值。</p> </blockquote> <figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!-- 后台 - 子标题 --></span></span><br><span class="line"><span class="tag"><<span class="name">title</span> <span class="attr">layout:title-pattern</span>=<span class="string">"$DECORATOR_TITLE - $CONTENT_TITLE"</span>></span>后台<span class="tag"></<span class="name">title</span>></span></span><br></pre></td></tr></table></figure> <h2 id="黑科技"><a href="#黑科技" class="headerlink" title="黑科技"></a>黑科技</h2><ol> <li>当我们想取一个对象里面的一个属性, 但这个对象可能为空时(😋)。<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">td</span> <span class="attr">th:text</span>=<span class="string">"${user?.address?.city}"</span>></span><span class="tag"></<span class="name">td</span>></span></span><br></pre></td></tr></table></figure></li> </ol> <div class="article-tag"> <a class="tag-link-link" href="/tags/HTML5/" rel="tag">HTML5</a>, <a class="tag-link-link" href="/tags/Thymeleaf/" rel="tag">Thymeleaf</a> </div> </div> <footer class="article-footer"> <div class="share-container"> </div> <a data-url="https://hocg.in/2017/10/18/Thymeleaf-3.0-%E6%89%8B%E5%86%8C/" data-id="cljkzfj1n0024c2ok5cw7am9o" class="article-share-link"><i class="fa fa-share"></i>分享到</a> <script> (function ($) { // Prevent duplicate binding if (typeof(__SHARE_BUTTON_BINDED__) === 'undefined' || !__SHARE_BUTTON_BINDED__) { __SHARE_BUTTON_BINDED__ = true; } else { return; } $('body').on('click', function() { $('.article-share-box.on').removeClass('on'); }).on('click', '.article-share-link', function(e) { e.stopPropagation(); var $this = $(this), url = $this.attr('data-url'), encodedUrl = encodeURIComponent(url), id = 'article-share-box-' + $this.attr('data-id'), offset = $this.offset(), box; if ($('#' + id).length) { box = $('#' + id); if (box.hasClass('on')){ box.removeClass('on'); return; } } else { var html = [ '<div id="' + id + '" class="article-share-box">', '<input class="article-share-input" value="' + url + '">', '<div class="article-share-links">', '<a href="https://twitter.com/intent/tweet?url=' + encodedUrl + '" class="fa fa-twitter article-share-twitter" target="_blank" title="Twitter"></a>', '<a href="https://www.facebook.com/sharer.php?u=' + encodedUrl + '" class="fa fa-facebook article-share-facebook" target="_blank" title="Facebook"></a>', '<a href="http://pinterest.com/pin/create/button/?url=' + encodedUrl + '" class="fa fa-pinterest article-share-pinterest" target="_blank" title="Pinterest"></a>', '<a href="https://plus.google.com/share?url=' + encodedUrl + '" class="fa fa-google article-share-google" target="_blank" title="Google+"></a>', '</div>', '</div>' ].join(''); box = $(html); $('body').append(box); } $('.article-share-box.on').hide(); box.css({ top: offset.top + 25, left: offset.left }).addClass('on'); }).on('click', '.article-share-box', function (e) { e.stopPropagation(); }).on('click', '.article-share-box-input', function () { $(this).select(); }).on('click', '.article-share-box-link', function (e) { e.preventDefault(); e.stopPropagation(); window.open(this.href, 'article-share-box-window-' + Date.now(), 'width=500,height=450'); }); })(jQuery); </script> </footer> </div> <nav id="article-nav"> <a href="/2017/10/19/JQuery.pjax%E6%97%A0%E6%B3%95%E5%86%8D%E6%AC%A1%E5%88%9D%E5%A7%8B%E5%8C%96%E5%BD%93%E5%89%8D%E9%A1%B5%E9%9D%A2%E7%9A%84JS/" id="article-nav-newer" class="article-nav-link-wrap"> <strong class="article-nav-caption">上一篇</strong> <div class="article-nav-title"> JQuery.pjax 无法再次初始化当前页面的JS </div> </a> <a href="/2017/10/10/JDK8%20%E6%96%B0%E7%89%B9%E6%80%A7%E7%9A%84%E4%BD%BF%E7%94%A8/" id="article-nav-older" class="article-nav-link-wrap"> <strong class="article-nav-caption">下一篇</strong> <div class="article-nav-title">JDK8 新特性的使用</div> </a> </nav> </article> <section id="comments"> <div id="valine-thread"></div> </section> </section> <aside id="sidebar"> <div class="widget-wrap"> <h3 class="widget-title">关注我</h3> <div class="widget"> <a class="social" href="https://github.com/hocgin" target="_blank"><i class="fa fa-github fa-2x"></i></a> <a class="social" href="https://hocg.in/atom.xml" target="_blank"><i class="fa fa-rss fa-2x"></i></a> <a class="social" href="https://resume.hocg.in/" target="_blank"><span class="fa-2x">简</span></a> <a class="social" href="https://projects.hocg.in/" target="_blank"><i class="fa fa-2x fa-fire"></i></a> <a class="social" href="https://panda.hocg.in/" target="_blank"><i class="fa fa-2x fa-heart"></i></a> <a class="social" href="https://weibo.com/u/2006617153" target="_blank"><i class="fa fa-weibo fa-2x"></i></a> <a class="social" href="https://www.500px.com/hocgin" target="_blank"><i class="fa fa-500px fa-2x"></i></a> </div> </div> <div class="widget-wrap"> <h3 class="widget-title">近期文章</h3> <div class="widget"> <ul id="recent-post" class="no-thumbnail"> <li> <div class="item-inner"> <!--<p class="item-category"><a class="article-category-link" href="/categories/Java/">Java</a></p>--> <p class="item-title fa fa-angle-right"><a href="/2020/12/10/%E8%AE%A9%E4%BD%A03%E6%AD%A5%E6%90%9E%E5%AE%9A%E5%8D%95%E7%82%B9%E7%99%BB%E9%99%86/" class="title">让你3步搞定单点登陆</a></p> <!--<p class="item-date"><time datetime="2020-12-10T10:28:29.000Z" itemprop="datePublished">2020-12-10</time></p>--> </div> </li> <li> <div class="item-inner"> <!--<p class="item-category"><a class="article-category-link" href="/categories/Java/">Java</a></p>--> <p class="item-title fa fa-angle-right"><a href="/2019/05/12/Java%20%E5%91%BD%E4%BB%A4%E5%B7%A5%E5%85%B7/" class="title">Java 命令工具</a></p> <!--<p class="item-date"><time datetime="2019-05-12T19:37:49.000Z" itemprop="datePublished">2019-05-12</time></p>--> </div> </li> <li> <div class="item-inner"> <!--<p class="item-category"><a class="article-category-link" href="/categories/Web/">Web</a></p>--> <p class="item-title fa fa-angle-right"><a href="/2019/04/18/%E5%85%B3%E4%BA%8E%E7%BD%91%E7%BA%A6%E8%BD%A6%E6%A0%B8%E5%BF%83%E4%B8%9A%E5%8A%A1-%E6%8E%A8%E5%8D%95%E7%9B%B8%E5%85%B3%E6%95%B4%E7%90%86/" class="title">关于网约车核心业务-推单相关设计整理</a></p> <!--<p class="item-date"><time datetime="2019-04-18T18:20:20.000Z" itemprop="datePublished">2019-04-18</time></p>--> </div> </li> <li> <div class="item-inner"> <!--<p class="item-category"><a class="article-category-link" href="/categories/Linux/">Linux</a></p>--> <p class="item-title fa fa-angle-right"><a href="/2019/04/01/Linux%20%E4%B8%8B%E7%BD%91%E7%BB%9C%E7%9B%B8%E5%85%B3%E7%9A%84%E5%91%BD%E4%BB%A4/" class="title">Linux 下网络相关的命令</a></p> <!--<p class="item-date"><time datetime="2019-04-01T08:07:00.000Z" itemprop="datePublished">2019-04-01</time></p>--> </div> </li> <li> <div class="item-inner"> <!--<p class="item-category"><a class="article-category-link" href="/categories/%E6%9C%8D%E5%8A%A1%E7%AB%AF/">服务端</a></p>--> <p class="item-title fa fa-angle-right"><a href="/2019/03/23/Elasticsearch%20%E9%9A%8F%E6%89%8B%E8%AE%B0/" class="title">Elasticsearch 随手记</a></p> <!--<p class="item-date"><time datetime="2019-03-23T13:53:00.000Z" itemprop="datePublished">2019-03-23</time></p>--> </div> </li> </ul> </div> </div> <div class="widget-wrap" id="widget-toc"> <h3 class="widget-title"> 文章目录 </h3> <div class="widget"> <!--toc--> <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active"> <div class="post-toc"> <ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#HTML5"><span class="nav-number">1.</span> <span class="nav-text">HTML5</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E6%A0%87%E7%AD%BE"><span class="nav-number">2.</span> <span class="nav-text">标签</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#th-each"><span class="nav-number">2.1.</span> <span class="nav-text">th:each</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#th-inline"><span class="nav-number">2.2.</span> <span class="nav-text">th:inline</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#th-fragment"><span class="nav-number">2.3.</span> <span class="nav-text">th:fragment</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#th-with"><span class="nav-number">2.4.</span> <span class="nav-text">th:with</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#th-if"><span class="nav-number">2.5.</span> <span class="nav-text">th:if</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#th-switch-x2F-th-case"><span class="nav-number">2.6.</span> <span class="nav-text">th:switch/th:case</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#th-selected"><span class="nav-number">2.7.</span> <span class="nav-text">th:selected</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E6%B3%A8%E9%87%8A%E8%AF%AD%E6%B3%95"><span class="nav-number">3.</span> <span class="nav-text">注释语法</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%A1%A8%E8%BE%BE%E5%BC%8F"><span class="nav-number">4.</span> <span class="nav-text">表达式</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#URL-%E8%A1%A8%E8%BE%BE%E5%BC%8F"><span class="nav-number">4.1.</span> <span class="nav-text">URL 表达式</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%9B%BD%E9%99%85%E5%8C%96%E8%A1%A8%E8%BE%BE%E5%BC%8F"><span class="nav-number">4.2.</span> <span class="nav-text">国际化表达式</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%8F%98%E9%87%8F%E8%A1%A8%E8%BE%BE%E5%BC%8F"><span class="nav-number">4.3.</span> <span class="nav-text">变量表达式</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%8F%98%E9%87%8F%E8%A1%A8%E8%BE%BE%E5%BC%8F-%E6%89%A9%E5%B1%95-1"><span class="nav-number">4.4.</span> <span class="nav-text">变量表达式 - 扩展 1</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%8F%98%E9%87%8F%E8%A1%A8%E8%BE%BE%E5%BC%8F-%E6%89%A9%E5%B1%95-2"><span class="nav-number">4.5.</span> <span class="nav-text">变量表达式 - 扩展 2</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E9%A2%84%E5%A4%84%E7%90%86%E8%A1%A8%E8%BE%BE%E5%BC%8F"><span class="nav-number">4.6.</span> <span class="nav-text">预处理表达式</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#Fragment-%E8%A1%A8%E8%BE%BE%E5%BC%8F"><span class="nav-number">4.7.</span> <span class="nav-text">Fragment 表达式</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%AF%AD%E6%B3%95"><span class="nav-number">5.</span> <span class="nav-text">表达式语法</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%8B%BC%E6%8E%A5"><span class="nav-number">5.1.</span> <span class="nav-text">字符串拼接</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%BF%90%E7%AE%97%E7%AC%A6%E5%8F%B7"><span class="nav-number">5.2.</span> <span class="nav-text">运算符号</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E4%B8%8E-%E6%88%96-%E9%9D%9E"><span class="nav-number">5.3.</span> <span class="nav-text">与 或 非</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%85%B3%E7%B3%BB%E8%A1%A8%E8%BE%BE%E5%BC%8F"><span class="nav-number">5.4.</span> <span class="nav-text">关系表达式</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%AE%80%E5%8D%95%E6%9D%A1%E4%BB%B6%E8%A1%A8%E8%BE%BE%E5%BC%8F"><span class="nav-number">5.5.</span> <span class="nav-text">简单条件表达式</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E8%A7%A3%E6%9E%90%E4%BC%98%E5%85%88%E7%BA%A7"><span class="nav-number">6.</span> <span class="nav-text">解析优先级</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E5%9F%BA%E7%A1%80%E5%AF%B9%E8%B1%A1"><span class="nav-number">7.</span> <span class="nav-text">基础对象</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#ctx-org-thymeleaf-spring4-context-SpringWebContext"><span class="nav-number">7.1.</span> <span class="nav-text">#ctx (org.thymeleaf.spring4.context.SpringWebContext)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#param-org-apache-catalina-util-ParameterMap"><span class="nav-number">7.2.</span> <span class="nav-text">param (org.apache.catalina.util.ParameterMap)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#session-org-thymeleaf-context-WebSessionVariablesMap"><span class="nav-number">7.3.</span> <span class="nav-text">session (org.thymeleaf.context.WebSessionVariablesMap)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#httpServletRequest-org-apache-catalina-connector-RequestFacade"><span class="nav-number">7.4.</span> <span class="nav-text">#httpServletRequest (org.apache.catalina.connector.RequestFacade)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#themes-org-thymeleaf-spring4-expression-Themes"><span class="nav-number">7.5.</span> <span class="nav-text">#themes (org.thymeleaf.spring4.expression.Themes)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#application"><span class="nav-number">7.6.</span> <span class="nav-text">application</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#dates-org-thymeleaf-expression-Dates"><span class="nav-number">7.7.</span> <span class="nav-text">#dates (org.thymeleaf.expression.Dates)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#calendars-org-thymeleaf-expression-Calendars"><span class="nav-number">7.8.</span> <span class="nav-text">#calendars (org.thymeleaf.expression.Calendars)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#numbers-org-thymeleaf-expression-Numbers"><span class="nav-number">7.9.</span> <span class="nav-text">#numbers (org.thymeleaf.expression.Numbers)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#strings-org-thymeleaf-expression-Strings"><span class="nav-number">7.10.</span> <span class="nav-text">#strings (org.thymeleaf.expression.Strings)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#objects-org-thymeleaf-expression-Objects"><span class="nav-number">7.11.</span> <span class="nav-text">#objects (org.thymeleaf.expression.Objects)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#bools-org-thymeleaf-expression-Bools"><span class="nav-number">7.12.</span> <span class="nav-text">#bools (org.thymeleaf.expression.Bools)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#arrays-org-thymeleaf-expression-Arrays"><span class="nav-number">7.13.</span> <span class="nav-text">#arrays (org.thymeleaf.expression.Arrays)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#lists-org-thymeleaf-expression-Lists"><span class="nav-number">7.14.</span> <span class="nav-text">#lists (org.thymeleaf.expression.Lists)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#sets-org-thymeleaf-expression-Sets"><span class="nav-number">7.15.</span> <span class="nav-text">#sets (org.thymeleaf.expression.Sets)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#maps-org-thymeleaf-expression-Maps"><span class="nav-number">7.16.</span> <span class="nav-text">#maps (org.thymeleaf.expression.Maps)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#aggregates-org-thymeleaf-expression-Aggregates"><span class="nav-number">7.17.</span> <span class="nav-text">#aggregates (org.thymeleaf.expression.Aggregates)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#messages-org-thymeleaf-expression-Messages"><span class="nav-number">7.18.</span> <span class="nav-text">#messages (org.thymeleaf.expression.Messages)</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#ids-org-thymeleaf-expression-Ids"><span class="nav-number">7.19.</span> <span class="nav-text">#ids (org.thymeleaf.expression.Ids)</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E9%87%8D%E7%82%B9"><span class="nav-number">8.</span> <span class="nav-text">重点</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E6%89%A9%E5%B1%95"><span class="nav-number">9.</span> <span class="nav-text">扩展</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#thymeleaf-layout-dialect"><span class="nav-number">9.1.</span> <span class="nav-text">thymeleaf-layout-dialect</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#layout-decorator"><span class="nav-number">9.1.1.</span> <span class="nav-text">layout:decorator</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#layout-fragment"><span class="nav-number">9.1.2.</span> <span class="nav-text">layout:fragment</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#layout-title-pattern"><span class="nav-number">9.1.3.</span> <span class="nav-text">layout:title-pattern</span></a></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E9%BB%91%E7%A7%91%E6%8A%80"><span class="nav-number">10.</span> <span class="nav-text">黑科技</span></a></li></ol> </div> </section> <!--/toc--> </div> </div> <div class="widget-wrap"> <h3 class="widget-title">归档</h3> <div class="widget"> <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2020/12/">十二月 2020</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/05/">五月 2019</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/04/">四月 2019</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/03/">三月 2019</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/02/">二月 2019</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/01/">一月 2019</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/12/">十二月 2018</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/11/">十一月 2018</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/07/">七月 2018</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/06/">六月 2018</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/03/">三月 2018</a><span class="archive-list-count">4</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/02/">二月 2018</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/01/">一月 2018</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/11/">十一月 2017</a><span class="archive-list-count">3</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/10/">十月 2017</a><span class="archive-list-count">5</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/09/">九月 2017</a><span class="archive-list-count">5</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/07/">七月 2017</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/06/">六月 2017</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/05/">五月 2017</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/04/">四月 2017</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/03/">三月 2017</a><span class="archive-list-count">4</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/02/">二月 2017</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/01/">一月 2017</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/10/">十月 2016</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/09/">九月 2016</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/08/">八月 2016</a><span class="archive-list-count">4</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/07/">七月 2016</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/06/">六月 2016</a><span class="archive-list-count">3</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/05/">五月 2016</a><span class="archive-list-count">1</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/04/">四月 2016</a><span class="archive-list-count">2</span></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2016/03/">三月 2016</a><span class="archive-list-count">3</span></li></ul> </div> </div> <div class="widget-wrap"> <h3 class="widget-title">标签云</h3> <div class="widget tagcloud"> <a href="/tags/Android/" style="font-size: 15px;">Android</a> <a href="/tags/CI-CD/" style="font-size: 10px;">CI/CD</a> <a href="/tags/CSS3/" style="font-size: 10px;">CSS3</a> <a href="/tags/Chrome/" style="font-size: 10px;">Chrome</a> <a href="/tags/DevOps/" style="font-size: 10px;">DevOps</a> <a href="/tags/Docker/" style="font-size: 10px;">Docker</a> <a href="/tags/ELK/" style="font-size: 10px;">ELK</a> <a href="/tags/Elasticsearch/" style="font-size: 10px;">Elasticsearch</a> <a href="/tags/GitLab/" style="font-size: 10px;">GitLab</a> <a href="/tags/Gnome/" style="font-size: 10px;">Gnome</a> <a href="/tags/Go/" style="font-size: 10px;">Go</a> <a href="/tags/Google/" style="font-size: 10px;">Google</a> <a href="/tags/HTML5/" style="font-size: 15px;">HTML5</a> <a href="/tags/HTTPS/" style="font-size: 10px;">HTTPS</a> <a href="/tags/Hexo/" style="font-size: 11.25px;">Hexo</a> <a href="/tags/IO/" style="font-size: 10px;">IO</a> <a href="/tags/JAVA/" style="font-size: 10px;">JAVA</a> <a href="/tags/JVM/" style="font-size: 12.5px;">JVM</a> <a href="/tags/Java/" style="font-size: 18.75px;">Java</a> <a href="/tags/JavaScript/" style="font-size: 12.5px;">JavaScript</a> <a href="/tags/K8s/" style="font-size: 10px;">K8s</a> <a href="/tags/Linux/" style="font-size: 10px;">Linux</a> <a href="/tags/Mac/" style="font-size: 12.5px;">Mac</a> <a href="/tags/Maven/" style="font-size: 10px;">Maven</a> <a href="/tags/Nexus/" style="font-size: 10px;">Nexus</a> <a href="/tags/Ngrok/" style="font-size: 10px;">Ngrok</a> <a href="/tags/NodeJS/" style="font-size: 12.5px;">NodeJS</a> <a href="/tags/Objective-C/" style="font-size: 10px;">Objective-C</a> <a href="/tags/Oh-My-ZSH/" style="font-size: 10px;">Oh My ZSH</a> <a href="/tags/OpenWrt/" style="font-size: 16.25px;">OpenWrt</a> <a href="/tags/PHP/" style="font-size: 10px;">PHP</a> <a href="/tags/Pjax/" style="font-size: 10px;">Pjax</a> <a href="/tags/React/" style="font-size: 10px;">React</a> <a href="/tags/Redis/" style="font-size: 10px;">Redis</a> <a href="/tags/SQL/" style="font-size: 10px;">SQL</a> <a href="/tags/Shell/" style="font-size: 11.25px;">Shell</a> <a href="/tags/Spring/" style="font-size: 10px;">Spring</a> <a href="/tags/Spring-Boot/" style="font-size: 10px;">Spring Boot</a> <a href="/tags/SpringBoot/" style="font-size: 10px;">SpringBoot</a> <a href="/tags/TCP-IP/" style="font-size: 10px;">TCP/IP</a> <a href="/tags/Thymeleaf/" style="font-size: 10px;">Thymeleaf</a> <a href="/tags/Tip/" style="font-size: 10px;">Tip</a> <a href="/tags/Tips/" style="font-size: 20px;">Tips</a> <a href="/tags/Ubuntu/" style="font-size: 17.5px;">Ubuntu</a> <a href="/tags/Web/" style="font-size: 10px;">Web</a> <a href="/tags/Wireshark/" style="font-size: 10px;">Wireshark</a> <a href="/tags/%E5%89%8D%E7%AB%AF/" style="font-size: 11.25px;">前端</a> <a href="/tags/%E5%9B%BE%E7%89%87%E5%A2%99/" style="font-size: 10px;">图片墙</a> <a href="/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/" style="font-size: 13.75px;">多线程</a> <a href="/tags/%E6%89%8B%E6%9C%BA/" style="font-size: 10px;">手机</a> <a href="/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" style="font-size: 10px;">数据结构</a> <a href="/tags/%E8%AE%BE%E8%AE%A1%E6%80%9D%E8%B7%AF/" style="font-size: 12.5px;">设计思路</a> <a href="/tags/%E8%AF%AD%E6%B3%95/" style="font-size: 11.25px;">语法</a> <a href="/tags/%E9%94%81/" style="font-size: 10px;">锁</a> <a href="/tags/%E9%97%AE%E9%A2%98/" style="font-size: 12.5px;">问题</a> </div> </div> <div class="widget-wrap widget-list"> <h3 class="widget-title">友情连接</h3> <div class="widget"> <ul> <li> <a href="https://blog.lutty.me/" target="_blank">lutty</a> </li> </ul> </div> </div> <div id="toTop" class="fa fa-angle-up"></div> </aside> </div> <footer id="footer"> <div class="outer"> <div id="footer-info" class="inner"> © 2023  <i class="fa fa-heartbeat heartbeat" style="color: #F22E3C;"></i>  <a class="me" href="https://hocg.in" target="_blank">hocgin</a>. <p> Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>. Theme by <a href="http://github.com/ppoffice" target="_blank">PPOffice</a>. Made by <a href="https://hocg.in">hocgin</a> </p> </div> </div> </footer> <script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script> <script src="//cdn.jsdelivr.net/gh/xcss/valine@v1.1.6/dist/Valine.min.js"></script> <script> new Valine({ el: '#valine-thread' , notify:false, verify:false, app_id: 'UgznLOt1wcUYIgK8LbBRwXOR-gzGzoHsz', app_key: 'hyCCbbO9B8bTXEBe1KEuJ95K', placeholder: '留言一下呗' }); </script> <script src="/libs/lightgallery/js/lightgallery.min.js"></script> <script src="/libs/lightgallery/js/lg-thumbnail.min.js"></script> <script src="/libs/lightgallery/js/lg-pager.min.js"></script> <script src="/libs/lightgallery/js/lg-autoplay.min.js"></script> <script src="/libs/lightgallery/js/lg-fullscreen.min.js"></script> <script src="/libs/lightgallery/js/lg-zoom.min.js"></script> <script src="/libs/lightgallery/js/lg-hash.min.js"></script> <script src="/libs/lightgallery/js/lg-share.min.js"></script> <script src="/libs/lightgallery/js/lg-video.min.js"></script> <script src="/libs/justified-gallery/jquery.justifiedGallery.min.js"></script> <!-- Custom Scripts --> <script src="/js/main.js"></script> <script src="/js/hocgin.js"></script> </div> <script> var xlm_wid='13073'; var xlm_url='https://www.xianliao.me/'; </script> <script type='text/javascript' charset='UTF-8' src='http://www.xianliao.me/embed.js'></script> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-7086639635704454" crossorigin="anonymous"></script> </body> </html>