使用和显示变量
@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)语言的表达式.
标准表达式功能的快速摘要
简单的表达式:
- 变量表达式:${…}
- 选择变量表达式:*{…}
- 消息表达式:#{…}
- URL链接表达式:@{…}
- 片段表达式:~{…}
常量
- 文本常量:’one text’、’Another one!’、…
- 数量常量:0、34、3.0、12.3、…
- Boolean常量:true、false
- Null 常量:null
- 标记常量:one、sometext、main、…
文本操作
- 字符串连接:+
- 文字替换:|The name is ${name}|
数学运算
- 二元运算符:+、-、*、/、%
- 负号(一元运算符):-
Boolean 运算
- 二元运算符:and、or
- Boolean的否定(一元运算符):!、not
比较和相等
- 比较的符号:>、<、>=、<=(gt、lt、ge、le)
- 等式运算符:==、!=(eq、ne)
条件运算符
- If-then:(if) ? (then)
- If-then-else:(if) ? (then) : (else)
- Default:(value) ?: (defaultvalue)
特殊符号
- 无操作符号:_
变量
${…}表达式实际上是在上下文中包含的变量的映射上执行 的OGNL(Object-Graph Navigation Language)表达式。
在Spring MVC启用的应用程序中,OGNL将被替换为SpringEL, 但其语法与OGNL的语法非常相似(实际上,对于大多数常见情况完全相同)。
<p>Today is: <span th:text="${today}">13 february 2011</span>.</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标准):
- #ctx: context object.
- #vars:the context variables.
- #locale: thecontext locale.
- #request: (only in Web Contexts)theHttpServletRequestobject.
- #response: (only in Web Contexts)theHttpServletResponseobject.
- #session: (only in Web Contexts)theHttpSessionobject.
- #servletContext: (only in Web Co […]
所以我们可以如下这样做:
Established locale country: <span th:text="${#locale.country}">US</span>.
表达式工具类(Expression Utility Objects)
除了这些基础对象,Thymeleaf还为我们提供了一些实用对象,帮助我们在表达式中执行常见的任务。
- #execInfo:正在处理的模板信息。
- #messages:用于获取变量表达式中的外部化消息的方法,与使用#{…}语法获得的方式相同。
- #uris:用于转义URL /URI的部分的方法。
- #conversions:执行配置的转换服务(如果有)的方法。
- #dates:java.util.Date对象的方法:格式化、组件提取等。
- #calendars:类似于#dates,但只是对于java.util.Calendar对象。
- #numbers:格式化数值对象的方法。
- #strings:String对象的方法,有contains、startsWith、prepending/appe […]
例如格式化日期:
<p>
Today is: <span th:text="${#calendars.format(today,'dd MMMM yyyy')}">13 May 2011</span>
</p>
选择表达式(星号语法)
不仅可以将变量表达式写为${…},还可以写为*{…}。
有一个重要的区别:星号语法在选定的对象上鉴定表达式,而不是在上下文中。 也就是说,只要没有选定的对象,美元和星号语法做的完全相同。
什么是选定的对象?使用th:object属性的表达式的结果。 我们在您的用户配置文件(userprofile.html)页面中使用一个:
<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>
当然,美元和星号语法可以混合:
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>
链接(URL)@{…}
URL是Web应用程序模板中的一等公民,Thymeleaf标准方言有一个特殊的语法,@语法:@{…}。
有不同类型的URL,分别如下:
- 绝对 URL:http://www.thymeleaf.org
相对 URL
- 相对于页面的:user/login.html
- 相对于上下文的:/itemdetails?id=3(服务器会自动添加上下文的名字)
- 相对于服务器的:~/billing/processInvoice(和服务器一样允许在另一个上下文(=application)中调用URL)。
- 相对于协议的URL://code.jquery.com/jquery-2.0.3.min.js。
<!-- Will produce 'http://localhost:8080/gtvg/order/details?orderId=3' (plus rewriting) -->
<a href="details.html"
th:href="@{http://localhost:8080/gtvg/order/details(orderId=${o.id})}">view</a>
<!-- Will produce '/gtvg/order/details?orderId=3' (plus rewriting) -->
<a href="details.html" th:href="@{/order/details(orderId=${o.id})}">view</a>
<!-- Will produce '/gtvg/order/3/details' (plus rewriting) -->
<a href="details.html" th:href="@{/order/{orderId}/details(orderId=${o.id})}">view</a>
如下这些事情要注意:
•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 file</span>.
</p>
2、数字常量
数字常量只是:数字。
<p>今年是: <span th:text="2013">1492</span>.</p>
<p>加上两年, 将会是: <span th:text="2013 + 2">1494</span>.</p>
3、Boolean类型的常量
Boolean类型的常量就是true和false。例如:
<div th:if="${user.isAdmin()} == false"> ...
在这个例子中,== false被写在花括号之外,所以它是由Thymeleaf来处理的。而如果它写在大括号内, 那将是OGNL/SpringEL引擎的责任:
<div th:if="${user.isAdmin() == false}"> ...
4、null常量
null也可以使用:
<div th:if="${variable.something} == null"> ...
5、附加文本(Appending text)
文本,无论是文字还是变量或消息表达式的计算结果,都可以使用+运算符轻松添加:
<span th:text="'The name of the user is ' + ${user.name}">
6、 字面值替代物(Literal substitution)
Literal substitution 可以很容易地格式化包含来自变量的值的字符串,而不需要用’…’ + ‘…’附加文字。
这些替代物必须被垂直条(|)包围,如:
<span th:text="|Welcome to our application, ${user.name}!|">
相当于:
<span th:text="'Welcome to our application, ' + ${user.name} + '!'">
Literal substitution 可以与其他类型的表达式组合:
<span th:text="${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(%)。
原文地址:https://blog.csdn.net/w_x_z_/article/details/72765929