• 单纯形式

    函数式:${…}

    选择函数式:*{…}

    消息函数式:#{…}

    链接URL函数式:@{…}

  • 常量

  • 字符串常量:'one text' , 'Another one!' ,…

    数字常量:0 , 34 , 3.0 , 12.3 ,…

    布尔常量:true , false

    Null常量:null

    象征常量:one , sometext , main ,…

  • 文字演算式

    文字列拼接:+

    常量替换:|The name is ${name}|

  • 算数演算式

    二进制演算式:+ , -, * , / , %

    单项目演算式:-

  • 逻辑演算式

    二项目演算式:and , or

    否定演算式:! , not

  • 比较演算式

    比较演算式;> , < , >= , <= ( gt , lt , ge, le )

    等价演算式:== , != ( eq , ne )

  • 条件演算式

    If-then: (if) ? (then)

    If-then-else: (if) ? (then) : (else)

    Default: (value) ?: (defaultvalue)

    例:

'User is of type ' + (${user.isAdmin()} ?  'Administrator' : (${user.type} ?: 'Unknown'))

消息的形式#{...},基于以下的消息书写格式

<p th:utext="#{home.welcome}">Welcome to our grocery store!p>

以下的链接文件必须

home.welcome=Bienvenido anuestra tienda de comestibles!

但是没有考虑带有参数的消息,比如,web应用中需要显示谁访问网站,并且在其下打出欢迎标语,可以向下面这样:

<p>Bienvenidoa nuestra tienda de comestibles, John Apricot!p>

最终,消息中存在参数的时候:

home.welcome=Bienvenido anuestra tienda de comestibles, {0}!

参数遵从java.text.MessageFormat的标准格式,根据其他类的API的文档,可以指定数值类型和时间类型Httpsession存在有user的参数时,可以按照以下的书写格式表示:

<p th:utext="#{home.welcome(${session.user.name})}"> Welcome to our grocery store, SebastianPepper!p>

多个参数可以用逗点分割,如下:

<p th:utext="#{${welcomeMsgKey}(${session.user.name})}"> Welcome to our grocery store, SebastianPepper!p>

变量的形式${...}实际上是,上下文中的变量通过map实施,OGNL(Object-Graph Navigation Language)

以下是OGNL的语法:

<p>Todayis: <span th:text="${today}">13february 2011span>.p>

上面的内容实际上和以下的内容同等:

ctx.getVariables().get("today");

但是使用OGNL更加强健,如下:

<p th:utext="#{home.welcome(${session.user.name})}"> Welcome to our grocery store, SebastianPepper!p>

事实上是通过以下的方法取得user

((User)ctx.getVariables().get("session").get("user")).getName();

通过OGNL的功能取得变量值的方法不止一种:

/*

  • 通过使用逗点取得属性,和通过Getter方法取得属性是相同的

     */

    ${person.father.name}

    /*

  • 通过使用([])可以取得指定的属性

  • 取得指定变量的属性,在([])记入字符串

     */

    ${person['father']['name']}

    /*

  • 对象是map的时候使用逗点和使用get(...)方法相同

     */

    ${countriesByCode.ES}

    ${personsByName['Stephen Zucchini'].age}

    /*

  • 数组或者是集合的时候同样可以使用([])的方法记入下标

     */

    ${personsArray[0].name}

    /*

  • 可以调用方法,可以有参数

     */

    ${person.createCompleteName()}

    ${person.createCompleteNameWithSeparator('-')}

使用OGNL表达式时的上下文对象:

  • #vars:上下文变量

  • #locale :上下文本地变量

  • #httpServletRequest : (web上下文) HttpServletRequest对象

  • #httpSession : (web上下文) HttpSession对象

可以像下面这样:

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

Utility对象

基本的对象以外,还提供通用的Utility对象。

  • #dates : java.util.Date对应的方法: format、component

  • #calendars : #dates相似java.util.Calendar对象用

  • #numbers : 数字对应的方法

  • #strings : String对象对应的方法:contains, startsWith, prepending/appending,

  • #objects : object对应的方法

  • #bools :布尔值对应的方法

  • #arrays :数组对应的方法

  • #lists : list对应的方法

  • #sets : set对应的方法

  • #maps : map对应的方法

  • #aggregates:数组和集合对应的方法

  • #messages: #{…}一样,对应其#{…}的抽出方法。

  • #ids : 通过循环处理,取得id的方法。

<p>

  Today is: <span th:text="${#calendars.format(today,'ddMMMM yyyy')}">13 May 2011span>

p>

变量表达式不仅有${...},也可以书写成*{...},重要的不同是,*表达式不是对应上下文变量的map,是对应已经选择的对象。如果没有已选择对象,$表达式和*表达式完全一样。对象的选择是什么?是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: <spanth:text="*{firstName}">Sebastianspan>.p>

  <p>Surname: <span th:text="${session.user.lastName}">Pepperspan>.p>

  <p>Nationality: <span th:text="*{nationality}">Saturnspan>.p>

div>

通过$表达式可以使用#object变量选择对象属性:

<div th:object="${session.user}">

  <p>Name: <spanth:text="${#object.firstName}">Sebastianspan>.p>

  <p>Surname: <span th:text="${session.user.lastName}">Pepperspan>.p>

  <p>Nationality: <span th:text="*{nationality}">Saturnspan>.p>

div>

循环的时候,object变量不能选择的时候,$表达式和*表达式完全一

<div>

  <p>Name: <spanth:text="*{session.user.name}">Sebastianspan>.p>

  <p>Surname: <span th:text="*{session.user.surname}">Pepperspan>.p>

  <p>Nationality: <span th:text="*{session.user.nationality}">Saturnspan>.p>div>

变量的形式@{...},对应URL存在以下形式:

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

  • 相对URL:

  • Page相对URL: user/login.html

  • 上下文相对URL: /itemdetails?id=3 (service内的上下文自动赋予)

  • Service相对URL: ~/billing/processInvoice (相同的service内可以调用不相同的上下文 (= application)的URL)

  • 协议相对URL: //code.jquery.com/jquery-2.0.3.min.js

Thymeleaf中可以使用对于URL相对的URL的时候IWebContext的上下文对象需要被实现使用其相上下文对象时,可以取得在httprequest内生成相对应的相对路径链接信息

使用th:href :

<a href="details.html"th:href="@{http://localhost:8080/gtvg/order/details(orderId=${o.id})}">a>

<a href="details.html"th:href="@{/order/details(orderId=${o.id})}">a>

<a href="details.html"th:href="@{/order/{orderId}/details(orderId=${o.id})}">a>

 

以下几点注意:

<a th:href="@{${url}(orderId=${o.id})}">viewa>

<a th:href="@{'/details/'+${user.login}(orderId=${o.id})}">viewa>

  • 字符串常量

    字符串常量是在单引号(’’)范围中的,什么文字都可以,使用\'转义单引号。

<p>

  Now you are looking at a <span th:text="'workingweb application'">templatefilespan>.

p>

  • 数值常量

    数字常量就是那样表示就可以。

<p>Theyear is <span th:text="2013">1492span>.p>

<p>Intwo years, it will be <spanth:text="2013+ 2">1494span>.p>

  • 布尔常量

    布尔常量是truefalse

<div th:if="${user.isAdmin()}== false"> ...

需要注意的是==false是在}的外面,这种时候,使用的是Thymeleaf自己的引擎处理。如果==false是在}的里面,使用的是OGNL/SpringEL引擎处理

<div th:if="${user.isAdmin()== false}">...

  • Null常量

    可以使用null常量

<div th:if="${variable.something} == null"> ...

  • Token常量

    数值常量,布尔常量,null常量是token常量的特殊形式。Token常量是单纯的语法,和字符串常量( '...' )一样,因为文字 ( A-Z and a-z ),数字 ( 0-9 ),括号 ( [] ), 句点是( . ), 横线是( - ) ,下划线是( _ )。所以写成以下的形式:

<div th:class="'content'">...div>

也可以写成以下的形式:

div th:class="content">...div>

字符串拼接是通过+演算式来实现的。字符串常量,值或者是消息文本都可以拼接:

th:text="'The name ofthe user is ' + ${user.name}"

因为使用常量替换使得format变得简单。'...' +'...'的形式就没有必要了。

常量替换的时候,替换范围使用竖线 ( | ):

<span th:text="|Welcometo our application, ${user.name}!|">

这和以下的方法相同:

<span th:text="'Welcometo our application, ' + ${user.name} + '!'">

常量替换的时候,也可以和其他的表达式混合使用:

<span th:text="${onevar}+ '' + |${twovar}, ${threevar}|">

注意点,常量替换要在( |...| )内使用,表达式只可以是${...},其他的常量( '...' )或者是布尔值,数值token或者是条件表达式是不可以使用的。

可以使用的演算式+ , - , * , / , %

th:with="isEven=(${prodStat.count}% 2 == 0)"

这个演算式也可以使用OGNL表达式:

th:with="isEven=${prodStat.count% 2 == 0}"

可替代演算式: div ( / ), mod ( % )

可以使用的演算式> , < , >= , <===!=但是在xml的属性中<>不可以使用的时候,需要用<>代替使用。

th:if="${prodStat.count}> 1" th:text="'Execution mode is ' + ( (${execMode} == 'dev')?'Development' : 'Production')"

可替代演算式: gt ( > ), lt ( < ), ge ( >= ), le ( <= ), not ( ! ), eq ( == ), neq / ne ( != )

<tr th:class="${row.even}?'even' : 'odd'">……tr>

条件演算式的三个部分( condition, then and else ),在式中可以使用( ${...} , *{...} ) ( #{...} )URL( @{...} ) ( '...' )

< tr th:class="${row.even}?(${row.first}? 'first' : 'even') : 'odd'">……tr>

Else可以省略

< tr th:class="${row.even}?'alt'">……tr>

默认演算式是then没有的特别条件。两个表达式最初的值为null的时候:

< div th:object="${session.user}">……

<p>Age:<span th:text="*{age}?: '(no age specified)'">27span>.p>

div >

年龄为null的时候和以下的方法相同:

< div th:object="${session.user}">……

<p>Age:<span th:text="*{age != null}? *{age} : '(no age specified)'">27span>..p>

div >

写在括号中是可以的:

<p>

  Name:

  <spanth:text="*{firstName}?:(*{admin}? 'Admin' : #{default.username})">Sebastianspan>

p>