Thymeleaf 标准表达式语法

使用和显示变量

@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)语言的表达式.

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

简单的表达式:

  1. 变量表达式:${…}
  2. 选择变量表达式:*{…}
  3. 消息表达式:#{…}
  4. URL链接表达式:@{…}
  5. 片段表达式:~{…}

常量

  1. 文本常量:’one text’、’Another one!’、…
  2. 数量常量:0、34、3.0、12.3、…
  3. Boolean常量:true、false
  4. Null 常量:null
  5. 标记常量:one、sometext、main、…

文本操作

  1. 字符串连接:+
  2. 文字替换:|The name is ${name}|

数学运算

  1. 二元运算符:+、-、*、/、%
  2. 负号(一元运算符):-

Boolean 运算

  1. 二元运算符:and、or
  2. Boolean的否定(一元运算符):!、not

比较和相等

  1. 比较的符号:>、<、>=、<=(gt、lt、ge、le)
  2. 等式运算符:==、!=(eq、ne)

条件运算符

  1. If-then:(if) ? (then)
  2. If-then-else:(if) ? (then) : (else)
  3. Default:(value) ?: (defaultvalue)

特殊符号

  1. 无操作符号:_

变量

${…}表达式实际上是在上下文中包含的变量的映射上执行 的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标准):

  1. #ctx: context object.
  2. #vars:the context variables.
  3. #locale: thecontext locale.
  4. #request: (only in Web Contexts)theHttpServletRequestobject.
  5. #response: (only in Web Contexts)theHttpServletResponseobject.
  6. #session: (only in Web Contexts)theHttpSessionobject.
  7. #servletContext: (only in Web Co […]

所以我们可以如下这样做:

Established locale country: <span th:text="${#locale.country}">US</span>. 

表达式工具类(Expression Utility Objects)

除了这些基础对象,Thymeleaf还为我们提供了一些实用对象,帮助我们在表达式中执行常见的任务。

  1. #execInfo:正在处理的模板信息。
  2. #messages:用于获取变量表达式中的外部化消息的方法,与使用#{…}语法获得的方式相同。
  3. #uris:用于转义URL /URI的部分的方法。
  4. #conversions:执行配置的转换服务(如果有)的方法。
  5. #dates:java.util.Date对象的方法:格式化、组件提取等。
  6. #calendars:类似于#dates,但只是对于java.util.Calendar对象。
  7. #numbers:格式化数值对象的方法。
  8. #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,分别如下:

  1. 绝对 URL:http://www.thymeleaf.org

相对 URL

  1. 相对于页面的:user/login.html
  2. 相对于上下文的:/itemdetails?id=3(服务器会自动添加上下文的名字)
  3. 相对于服务器的:~/billing/processInvoice(和服务器一样允许在另一个上下文(=application)中调用URL)。
  4. 相对于协议的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值