您的位置:首页 > 其它

Thymeleaf 标准表达式语法

2017-05-26 13:57 344 查看
摘自: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)语言的表达式.

标准表达式功能的快速摘要

简单的表达式:

变量表达式:${…}

选择变量表达式:*{…}

消息表达式:#{…}

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(%)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息