摘自:thymeleaf 3 完全手册 (https://read.douban.com/ebook/33154430/)
使用和显示变量
@Controller
public class HomeController {
@RequestMapping("home")
public String toHome(Model model){
model.addAttribute("home", "这是首页");
return "home";
}
}
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta content="text/html;charset=UTF-8" />
head>
<body>
<span th:text="${home}">span>
body>
html>
${…},变量表达式,它包含一个称为OGNL(Object-Graph Navigation Language)语言的表达式.
标准表达式功能的快速摘要
简单的表达式:
常量
文本操作
数学运算
Boolean 运算
比较和相等
条件运算符
特殊符号
变量
${…}表达式实际上是在上下文中包含的变量的映射上执行 的OGNL(Object-Graph Navigation Language)表达式。
在Spring MVC启用的应用程序中,OGNL将被替换为SpringEL, 但其语法与OGNL的语法非常相似(实际上,对于大多数常见情况完全相同)。
<p>Today is: <span th:text="${today}">13 february 2011span>.p>
OGNL的特性
/*
* 使用点(.)访问属性。相当于调用属性getter。
*/
${person.father.name}
/*
* 还可以通过使用中括号([])并将属性的
* 名称作为变量或单引号来访问属性。
*/
${person['father']['name']}
/*
* 如果对象是一个map, 点和中括号语法将
* 等效于对其get(...)方法执行调用。
*/
${countriesByCode.ES}
${personsByName['Stephen Zucchini'].age}
/*
* 对数组或集合的索引访问也使用中括号执行,
* 不使用引号编写索引。
*/
${personsArray[0].name}
/*
* 方法可以调用, 甚至可以有参数。
*/
${person.createCompleteName()}
${person.createCompleteNameWithSeparator('-')}
表达式基本对象
在上下文变量中评估OGNL表达式时,一些对象可用于表达式,以实现更高的灵活性。 这些对象从#符号开始就会被引用(根据OGNL标准):
所以我们可以如下这样做:
Established locale country: <span th:text="${#locale.country}">USspan>.
表达式工具类(Expression Utility Objects)
除了这些基础对象,Thymeleaf还为我们提供了一些实用对象,帮助我们在表达式中执行常见的任务。
例如格式化日期:
<p>
Today is: <span th:text="${#calendars.format(today,'dd MMMM yyyy')}">13 May 2011span>
p>
选择表达式(星号语法)
不仅可以将变量表达式写为${…},还可以写为*{…}。
有一个重要的区别:星号语法在选定的对象上鉴定表达式,而不是在上下文中。 也就是说,只要没有选定的对象,美元和星号语法做的完全相同。
什么是选定的对象?使用th:object属性的表达式的结果。 我们在您的用户配置文件(userprofile.html)页面中使用一个:
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastianspan>.p>
<p>Surname: <span th:text="*{lastName}">Pepperspan>.p>
<p>Nationality: <span th:text="*{nationality}">Saturnspan>.p>
div>
这完全等同于:
<div>
<p>Name: <span th:text="${session.user.firstName}">Sebastianspan>.p>
<p>Surname: <span th:text="${session.user.lastName}">Pepperspan>.p>
<p>Nationality: <span th:text="${session.user.nationality}">Saturnspan>.p>
div>
当然,美元和星号语法可以混合:
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastianspan>.p>
<p>Surname: <span th:text="${session.user.lastName}">Pepperspan>.p>
<p>Nationality: <span th:text="*{nationality}">Saturnspan>.p>
div>
链接(URL)@{…}
URL是Web应用程序模板中的一等公民,Thymeleaf标准方言有一个特殊的语法,@语法:@{…}。
有不同类型的URL,分别如下:
相对 URL
<a href="details.html"
th:href="@{http://localhost:8080/gtvg/order/details(orderId=${o.id})}">viewa>
<a href="details.html" th:href="@{/order/details(orderId=${o.id})}">viewa>
<a href="details.html" th:href="@{/order/{orderId}/details(orderId=${o.id})}">viewa>
如下这些事情要注意:
•th:href是一个修饰符属性:一旦执行,它就会计算要使用的URL链接,并将该值设置为a>标签的href属性。
•我们可以使用URL参数的表达式(正如您可以在orderId = ${o.id}中看到的)。所需的URL参数编码操作也将自动执行。
•如果需要多个参数,用逗号将这些参数分隔:@{/order/process(execId=${execId},execType=’FAST’)}
• URL路径中也允许使用变量模板:@{/order/{orderId}/details(orderId=${orderId})}
•以/(例如:/order/details)开头的相对网址将自动以应用程序上下文名称为前缀。
•如果未启用Cookie,或者尚未知道Cookie,则可能会在相对URL中添加一个“;jsessionid = …”后缀,以便保留会话。这被称为URL重写,Thymeleaf允许您通过使用response.encodeURL(…)机制从 Servlet API为每个URL插入自己的重写过滤器。
•th:href属性允许(可选)在模板中有一个工作的静态href属性,这样,当直接打开原型时, 模板链接仍然可以被浏览器导航。
常量(Literal)
1、文本常量
文本文字只是在单引号之间指定的字符串。它们可以包含任何字符,但是您应该使用\’转义其中的任何单引号。
<p>
Now you are looking at a <span th:text="'working web application'">template filespan>.
p>
2、数字常量
数字常量只是:数字。
<p>今年是: <span th:text="2013">1492span>.p>
<p>加上两年, 将会是: <span th:text="2013 + 2">1494span>.p>
3、Boolean类型的常量
Boolean类型的常量就是true和false。例如:
if="${user.isAdmin()} == false"> ...
在这个例子中,== false被写在花括号之外,所以它是由Thymeleaf来处理的。而如果它写在大括号内, 那将是OGNL/SpringEL引擎的责任:
if="${user.isAdmin() == false}"> ...
4、null常量
null也可以使用:
if="${variable.something} == null"> ...
5、附加文本(Appending text)
文本,无论是文字还是变量或消息表达式的计算结果,都可以使用+运算符轻松添加:
"'The name of the user is ' + ${user.name}">
6、 字面值替代物(Literal substitution)
Literal substitution 可以很容易地格式化包含来自变量的值的字符串,而不需要用’…’ + ‘…’附加文字。
这些替代物必须被垂直条(|)包围,如:
"|Welcome to our application, ${user.name}!|">
相当于:
"'Welcome to our application, ' + ${user.name} + '!'">
Literal substitution 可以与其他类型的表达式组合:
"${onevar} + ' ' + |${twovar}, ${threevar}|">
在| … |字面替换中只允许有变量表达式(${…})。 没有其他文字(’…’)、布尔/数字标记,条件表达式等。
7、算术运算(Arithmetic operation)
也会用到一些算术运算:+、-、*、/和%。
<div th:with="isEven=(${prodStat.count} % 2 == 0)">
注意,这些运算符也可以应用于OGNL变量表达式本身(在这种情况下,将由OGNL而不是 Thymeleaf标准表达式引擎执行):
<div th:with="isEven=${prodStat.count % 2 == 0}">
请注意,对于其中一些操作符,存在文本别名:div(/)、mod(%)。