Thymeleaf官方學習地址:https://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#what-is-thymeleaf
以下是個人筆記(只記錄了比較具有特色的方言):
Spring Boot提供了默認配置的模板引擎主要有以下幾種:
- Thymeleaf
- FreeMarker
- Velocity
- Groovy
- Mustache
因項目需要使用SpringBoot框架,所以需瞭解幾種默認的模版引擎。
Thymeleaf標準表達式功能的快速瞭解:
- 簡單表達:變量表達式: ${...}
- 選擇變量表達式: *{...}
- 消息表達式: #{...}
- 鏈接網址表達式: @{...}
- 字面文本文字:'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)
- 所有這些功能都可以組合和嵌套使用:
- 例子:'User is of type ' + (${user.isAdmin()} ? 'Administrator' : (${user.type} ?: 'Unknown'))
${...}
表達式實際上是在上下文中包含的變量映射上執行的OGNL(對象 - 圖形導航語言)表達式。OGNL官方瞭解地址:http://commons.apache.org/proper/commons-ognl/
表達式基本對象,可用於表達式以獲得更高的靈活性,將以
#
符號開頭引用這些對象(按照OGNL標準):
#ctx
:上下文對象。#vars:
上下文變量。#locale
:上下文區域設置。#httpServletRequest
:(僅限Web Contexts)HttpServletRequest
對象。#httpSession
:(僅限Web Contexts)HttpSession
對象。除了這些基本對象,Thymeleaf還將爲我們提供一組實用程序對象,幫助我們在表達式中執行常見任務。
#dates
:java.util.Date
對象的實用方法:格式化,組件提取等。#calendars
:類似於#dates
,但java.util.Calendar
對象。#numbers
:用於格式化數字對象的實用方法。#strings
:String
對象的實用方法:contains,startsWith,prepending / appending等。#objects
:一般的對象的實用方法。#bools
:布爾評估的實用方法。#arrays
:數組的實用方法。#lists
:列表的實用方法。#sets
:集合的實用方法。#maps
:地圖的實用方法。#aggregates
:用於在數組或集合上創建聚合的實用程序方法。#messages
:用於在變量表達式中獲取外部化消息的實用程序方法,與使用#{...}語法獲取它們的方式相同。#ids
:用於處理可能重複的id屬性的實用程序方法(例如,作爲迭代的結果)。
變量表達式不僅可以用
${...}
表達式編寫,還可以用表達式編寫*{...}
。官方示例:
<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>
Thymeleaf標準方言具有特殊的語法,
@
語法:@{...}
有不同類型的網址:
- 絕對的URL,比如
http://www.thymeleaf.org
- 相對URL,可以是:
- 頁面相對,像
user/login.html
- 上下文相關,如
/itemdetails?id=3
(服務器中的上下文名稱將自動添加)- 與服務器相關,
~/billing/processInvoice
(允許在同一服務器中調用另一個上下文(=應用程序)中的URL)。- 協議相對URL,如
//code.jquery.com/jquery-2.0.3.min.js
Thymeleaf可以在任何情況下處理絕對URL,但對於相對URL,它將要求您使用實現該
IWebContext
接口的上下文對象,該接口包含來自HTTP請求的一些信息以及創建相對鏈接所需的信息。官方示例:
<!-- 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。- 我們可以使用表達式來指定URL參數(如您所見
orderId=${o.id}
)。還將自動執行所需的URL編碼操作。- 如果需要幾個參數,這些參數將用逗號分隔
@{/order/process(execId=${execId},execType='FAST')}
- URL路徑中也允許使用變量模板,例如
@{/order/{orderId}/details(orderId=${orderId})}
- 以
/
(like/order/details
)開頭的相對URL 將自動以應用程序上下文名稱爲前綴。- 如果未啓用cookie或尚未知道cookie,則
";jsessionid=..."
可能會在相對URL中添加後綴,以便保留會話。這稱爲URL重寫,Thymeleaf允許您通過response.encodeURL(...)
Servlet API爲每個URL 插入自己的重寫過濾器。- 該
th:href
標記允許我們(可選)有一個靜態的工作href
在我們的模板屬性,所以,當爲原型的目的直接打開我們的模板鏈接仍然通航由瀏覽器。
文字替換允許輕鬆格式化包含變量值的字符串,而無需附加文字'...' + '...'
。這些替換必須用豎線(|
)包圍,如:
官方示例:
<span th:text="|Welcome to our application, ${user.name}!|">
相當於:
<span th:text="'Welcome to our application, ' + ${user.name} + '!'">
注意:${...}
在|...|
文字替換中只允許使用變量表達式()。沒有其他文字('...'
),布爾/數字標記,條件表達式等。