首页 专题 文章 代码 归档
Thymeleaf模板引擎
2020.02.18 18:41 2020.02.29 19:47

1. thymeleaf引擎

1.1. 介绍

Thymeleaf是适用于Web和独立环境的现代服务器端Java模板引擎,能够处理HTML,XML,JavaScript,CSS甚至纯文本。

Thymeleaf的主要目标是提供一种优雅且高度可维护的模板创建方式。 为此,它以自然模板的概念为基础,以不影响模板用作设计原型的方式将其逻辑注入模板文件。 这样可以改善设计沟通,并缩小设计团队与开发团队之间的差距。

Thymeleaf的设计也从一开始就考虑了Web标准-尤其是HTML5-允许您在需要时创建完全验证的模板。

1.2. 引入

<html lang="en" xmlns:th="http://www.thymeleaf.org">

需要引入xmlns:th="http://www.thymeleaf.org"

2. 具体逻辑

2.1. 表达式

Thymeleaf对于变量的操作主要有$*#三种方式:

  1. 变量表达式: ${...},是获取容器上下文变量的值.
  2. 选择变量表达式: *{...},获取指定的对象中的变量值。如果是单独的对象,则等价于${}。
  3. 消息表达式: #{...}表达式与th:text一起使用,加载数据源中的消息,用于国际化
  4. 链接网址表达式: @{...},获取网址链接
2.1.1. ${...}

html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
<div th:text="${hello}"></div>
</body>
</html>

Java:

@RequestMapping("/test")
public String hello(Model model) {
    System.out.println("hello");
    model.addAttribute("hello", "'World'");
    return "index";
}
2.1.2. *{...}

变量表达式不仅可以用${...}表达式编写,还可以用于表达式*{...}。选择表达式所选择的对象是当前环境内的变量值,如果对于单一变量(非对象),则${…}和*{…}完全等价。

使用方法:首先通过th:object 获取对象,然后使用th:xx = "*{}"获取对象属性。

<ul th:object="${stu}">
    <li th:text="*{sname}"></li>
    <li th:text="*{sno}"></li>
    <li th:text="*{gender}"></li>
    <li th:text="*{age}"></li>
</ul>
2.1.3. @{...}

使用方法:通过链接表达式@{}直接拿到应用路径,然后拼接静态资源路径。例如:

<script th:src="@{/webjars/jquery/jquery.js}"></script>
<link th:href="@{/webjars/bootstrap/css/bootstrap.css}" rel="stylesheet" type="text/css">

如果有变量的话,加括号:

<a th:href="@{/admin/lists(page=${results.getCurrent()-1})}">上一页</a>

上面就会渲染:xxx.com/admin/lists?page=1,所以这时直接加参数的,有?

2.1.4. ~{...}

片段表达式是Thymeleaf的特色之一,细粒度可以达到标签级别,这是JSP无法做到的。 片段表达式拥有三种语法:

  1. ~{ viewName } 表示引入完整页面
  2. ~{ viewName ::selector} 表示在指定页面寻找片段 其中selector可为片段名、jquery选择器等
  3. ~{ ::selector} 表示在当前页寻找

使用方法:首先通过th:fragment定制片段 ,然后通过th:replace 填写片段路径和片段名。例如:

<!-- /common/head.html-->
<div th:fragment="Text">
    <strong>This fragment text.</strong>
</div>

<!-- /Test.html -->
<body>
<div th:replace="~{common/head::Text}"></div>
</body>

在实际使用中,我们往往使用更简洁的表达,去掉表达式外壳直接填写片段名。例如:

<div th:replace="common/head::Text"></div>

值得注意的是,使用替换路径th:replace 开头请勿添加斜杠,避免部署运行的时候出现路径报错。(因为默认拼接的路径为spring.thymeleaf.prefix = classpath:/templates/)

2.1.5. 信息表达式

即通常的国际化属性:#{msg} 用于获取国际化语言翻译值。例如:

<title th:text="#{user.title}"></title>
2.1.6. 其他表达式

在基础语法中,默认支持字符串连接、数学运算、布尔逻辑和三目运算等。例如:

<input name="name" th:value="${'I am '+(user.name!=null?user.name:'NoBody')}"/>

2.2. 内置对象

  • ${#ctx} 上下文对象,可用于获取其它内置对象。
  • ${#vars}: 上下文变量。
  • ${#locale}:上下文区域设置。
  • ${#request}: HttpServletRequest对象。
  • ${#response}: HttpServletResponse对象。
  • ${#session}: HttpSession对象。
  • ${#servletContext}: ServletContext对象。

2.3. 工具类

  • #strings:字符串工具类
  • #lists:List 工具类
  • #arrays:数组工具类
  • #sets:Set 工具类
  • #maps:常用Map方法。
  • #objects:一般对象类,通常用来判断非空
  • #bools:常用的布尔方法。
  • #execInfo:获取页面模板的处理信息。
  • #messages:在变量表达式中获取外部消息的方法,与使用#{...}语法获取的方法相同。
  • #uris:转义部分URL / URI的方法。
  • #conversions:用于执行已配置的转换服务的方法。
  • #dates:时间操作和时间格式化等。
  • #calendars:用于更复杂时间的格式化。
  • #numbers:格式化数字对象的方法。
  • #aggregates:在数组或集合上创建聚合的方法。
  • #ids:处理可能重复的id属性的方法。

2.4. 数据循环(遍历)

想要遍历List集合很简单,配合th:each 即可快速完成迭代。例如遍历用户列表:

<div th:each="user:${userList}">
    账号:<input th:value="${user.username}"/>
    密码:<input th:value="${user.password}"/>
</div>

在集合的迭代过程还可以获取状态变量,只需在变量后面指定状态变量名即可,状态变量可用于获取集合的下标/序号、总数、是否为单数/偶数行、是否为第一个/最后一个。例如:

<div th:each="user,stat:${userList}" th:class="${stat.even}?'even':'odd'">
    下标:<input th:value="${stat.index}"/>
    序号:<input th:value="${stat.count}"/>
    账号:<input th:value="${user.username}"/>
    密码:<input th:value="${user.password}"/>
</div>

如果缺省状态变量名,则迭代器会默认帮我们生成以变量名开头的状态变量 xxStat, 例如:

<div th:each="user:${userList}" th:class="${userStat.even}?'even':'odd'">
    下标:<input th:value="${userStat.index}"/>
    序号:<input th:value="${userStat.count}"/>
    账号:<input th:value="${user.username}"/>
    密码:<input th:value="${user.password}"/>
</div>

2.5. 逻辑处理

2.5.1. 条件判断
<div th:if="${userList}">
    <div>的确存在..</div>
</div>
<div th:unless="${userList}">
    <div>不存在..</div>
</div>

2.6. 日期格式化

使用默认的日期格式(toString方法) 并不是我们预期的格式:Mon Dec 03 23:16:50 CST 2018

<input type="text" th:value="${user.createTime}"/>

此时可以通过时间工具类#dates来对日期进行格式化:2018-12-03 23:16:50

<input type="text" th:value="${#dates.format(user.createTime,'yyyy-MM-dd HH:mm:ss')}"/>

2.7. 内联写法

为什么要使用内联写法?·因为 JS无法获取服务端返回的变量。

如何使用内联表达式?标准格式为:[[${xx}]] ,可以读取服务端变量,也可以调用内置对象的方法。例如获取用户变量和应用路径:

<script th:inline="javascript">
    var user = [[${user}]];`
    var APP_PATH = [[${#request.getContextPath()}]];
    var LANG_COUNTRY = [[${#locale.getLanguage()+'_'+#locale.getCountry()}]];
</script>

标签引入的JS里面能使用内联表达式吗?不能!内联表达式仅在页面生效,因为Thymeleaf只负责解析一级视图,不能识别外部标签JS里面的表达式。

2.8. 国际化

例如在国际化文件中编写了user.title这个键值,然后使用#{}读取这个KEY即可获取翻译。

<title th:text="#{user.title}">用户登陆</title>
本节阅读完毕! (分享
二维码图片 扫描关注我们哟