2. 標准表達式(Standard Expression Syntax)
標准表達式包含以下幾個方面:
- 簡單表達式:
- 變量表達式:
${...} - 選擇變量表達式:
*{...} - 消息表達式:
#{...} - 鏈接網址表達式:
@{...} - 片段表達式:
~{...}
- 變量表達式:
- 字面
- 文本文字:
'one text','Another one!',... - 數字文字:
0,34,3.0,12.3,... - 布爾文字:
true,false - 空字面:
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) - 默認:
(value) ?: (defaultvalue)
- IF-THEN:
- 特殊令牌:
- 無操作:
下面將分別介紹:
2.1 簡單表達式
2.1.1變量表達式:${...}
模板名稱:var.html 原理類似OGNL/SpringEL表達式
e.g.
1. Established locale country: <span th:text="${#locale.country}">US</span> 2. <p> Today is: <span th:text="${#calendars.format(today,'dd MMMM yyyy')}">13 May 2011</span></p>
附:
① Expression Basic Objects (表達式基本對象)
當對上下文變量評估OGNL表達式時,某些對象可用於表達式以獲得更高的靈活性。這些對象將被引用(按照OGNL標准),從
#符號開始:
#ctx:上下文對象。#vars:上下文變量。#locale:上下文區域設置。#request:(僅在Web上下文中)HttpServletRequest對象。#response:(僅在Web上下文中)HttpServletResponse對象。#session:(僅在Web上下文中)HttpSession對象。#servletContext:(僅在Web上下文中)ServletContext對象。
示例:
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 / appending等#objects:一般對象的方法。#bools:布爾評估的方法。#arrays:數組方法。#lists:列表的方法。#sets:集合的方法。#maps:地圖方法。#aggregates:在數組或集合上創建聚合的方法。#ids:處理可能重復的id屬性的方法(例如,作為迭代的結果)。
2.1.2選擇性/星號表達式:*{...}
不僅可以將變量表達式寫為${...},也可以寫為*{...}。
有一個重要的區別:星號語法評估所選對象而不是整個上下文的表達式。也就是說,只要沒有選定的對象,美元和星號語法就會完全相同。
模板名稱:star.html
e.g.
<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>
equals.
<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>
2.1.3 消息表達式:#{...}
模板名稱:message.html message 國際化支持 語法格式:#{ }
e.g.
<p th:utext="#{home.welcome}">Welcome to our grocery store!</p>
2.1.4 鏈接表達式:@{...}
模板名稱:link.html
語法格式:@{ }
示例:
<!-- 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>
下面針對不同類型網址做一詳細介紹
①.絕對URL(Absolute URLs) 開始通過指定協議名稱(包含http://或https://開頭) e.g. <a th:href="@{http://www.thymeleaf/documentation.html}"></a> equals: <a href="http://www.thymeleaf/documentation.html"></a> ②. 上下文相關的URL(Context-relative URLs) 最常用的如應用程序myapp的訪問地址:http://localhost:8080/myapp,那么myapp就是上下文名稱。 e.g.<a th:href="@{/order/list}"></a> equals:<a href="/myapp/order/list"></a> 說明:“/”表示從應用程序根路徑開始訪問 ,去掉“/”表示相對路徑 ③.相對於服務器的URL(Server-relative URLs) 用法類似2,連接到同一服務器不同應用程序中 e.g. <a th:href="@{~/billing-app/showDetails.htm}"></a> equals: <a href="/billing-app/showDetails.htm"></a> note:當前應用程序的上下文myapp將被忽略 ④.協議相對URL(Protocol-relative URLs) 通常用於,包括外部資源,如樣式,腳本等。保證協議(HTTP,HTTPS)用於顯示當前頁面的絕對URL。 e.g. <script th:src="@{//scriptserver.example.net/myscript.js}">...</script> equals: <script src="//scriptserver.example.net/myscript.js">...</script> ⑤.帶參數的URL表達式 e.g. 1.<a th:href="@{/order/details(id=3)}"></a> equals: <a href="/order/details?id=3"></a> 2.攜帶多參數:<a th:href="@{/order/details(id=3,action='show_all')}"></a> equals: <a href="/order/details?id=3&action=show_all"></a>
2.1.5 片段表達式:~{...}
片段表達式的語法是非常簡單的。有三種不同的格式:
"~{templatename::selector}"包含在命名的模板上應用指定的標記選擇器導致的片段templatename。請注意,selector可以只是一個片段名稱,所以你可以指定~{templatename::fragmentname}像~{footer :: copy}上面那樣簡單的東西。
標記選擇器語法由底層的AttoParser解析庫定義,類似於XPath表達式或CSS選擇器。
"~{templatename}"包括完整的模板命名templatename。
請注意,您在th:insert/ th:replacetags中使用的模板名稱必須由Template Engine當前使用的Template Resolver解析。
~{::selector}"或"~{this::selector}"包含同一模板的片段。
雙方templatename並selector在上面的例子可以是全功能的表達式(甚至條件語句!),如:
<div th:insert="footer :: (${user.isAdmin}? #{footer.admin} : #{footer.normaluser})"></div>
片段可以包括任何th:*屬性。一旦片段被包含在目標模板(具有th:insert/ th:replaceattribute)的模板中,這些屬性將被評估,並且它們將能夠引用此目標模板中定義的任何上下文變量。
這種分片方法的一大優點是,您可以將頁面中的片段寫入瀏覽器完美顯示的頁面,並具有完整而有效的標記結構,同時仍保留使Thymeleaf包含在其他模板中的功能。
