单纯形式
函数式:${…}
选择函数式:*{…}
消息函数式:#{…}
链接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的文档,可以指定数值类型和时间类型。Http的session存在有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を的上下文对象需要被实现。使用其相上下文对象时,可以取得在http的request内生成相对应的相对路径链接信息。
使用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>
以下几点注意:
URL的参数可以指定 ( orderId=${o.id}的部分)。自动的编程进去。
多个参数指定的时候,可以使用都好分割@{/order/process(execId=${execId},execType='FAST')}
URL路径内可以使用变量@{/order/{orderId}/details(orderId=${orderId})}
以/开始是相对URL( /order/details ),自动的在应用前面补充上去。
不使用cookie时,或者不知道的时候把";jsessionid=..."追加在对应的URL后面。使用cookie的时候。调用URL Rewriting,Thymeleaf对应全部的URL。
使用Servlet API的response.encodeURL(...)的结构时,需要单独追加lib文件。
使用th:href 标签的时候,可以指定任意的href属性,这样可以直接通过浏览器打开文件。
消息表达式 ( #{...} )同样可以使用URL链接形式。
<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>
布尔常量
布尔常量是true和false
<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>