4、標準表達式語法css
· 簡單表達式 (simple expressions)html
${...} 變量表達式java
*{...} 選擇變量表達式jquery
#{...} 消息表達式web
@{...} 連接url表達式express
· 字面量數組
'one text','another one!',... 文本服務器
0,34,3.0,12.3,... 數值app
true false 布爾類型less
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
<tr th:class="${row.even}? 'even' : 'odd'"> ... </tr>
條件表達式中的三個部分自身也能夠是表達式,也能夠是變量(${...}, *{...}), 消息(#{...}), URL (@{...}) 或字面量 ('...')
條件表達式也能夠使用括號來嵌套:
<tr th:class="${row.even}? (${row.first}? 'first' : 'even') : 'odd'"> ... </tr>
else表達式也能夠省略,當條件爲false時,會返回null:
<tr th:class="${row.even}? 'alt'"> ... </tr>
(value) ?: (defaultvalue) Default
只有在第一個表達式返回null時,第二個表達式纔會運算
·表達式工具對象
·連接URL
URL在web模板中是一級重要元素,使用@{…}表示
URL的類型:
絕對URL:
相對URL:
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>
· 預處理
Thymeleaf提供預處理表達式的功能。
它是在錶殼式正常執行前執行的操做,容許修改最終將要被執行的表達式。
預處理表達式跟正常的同樣,但被兩個下劃線包圍住,例如:__${expression}__
假設有一個i18n消息文件Message_fr.properties,裏面有一個條目包含了一個調用具體語言的靜態方法的OGNL表達式:
article.text=@myapp.translator.Translator@translateToFrench({0})
Messages_es.properties中的等價條目:
article.text=@myapp.translator.Translator@translateToSpanish({0})
能夠根據locale先建立用於運算表達式的標記片斷,本例中,先經過預處理選擇表達式,而後讓Thymeleaf處理這個選擇出來的表達式:
<p th:text="${__#{article.text('textVar')}__}">Some text here...</p>
對於locale爲French的狀況,上面的表達式通過預處理後,得出的等價物以下:
<p th:text="${@myapp.translator.Translator@translateToFrench(textVar)}">Some text here...</p>
5、 設置屬性值
th:attr 任何屬性值
<form action="subscribe.html" th:attr="action=@{/subscribe}"> <fieldset> <input type="text" name="email" /> <input type="submit" value="Subscribe me!" th:attr="value=#{subscribe.submit}"/> </fieldset> </form>
多個屬性一塊兒設置,用逗號隔開
<img src="../../images/gtvglogo.png" th:attr="src=@{/images/gtvglogo.png},title=#{logo},alt=#{logo}" />
設置指定屬性
th:abbr th:accept th:accept-charset
th:accesskey th:action th:align
th:alt th:archive th:audio
th:autocomplete th:axis th:background
th:bgcolor th:border th:cellpadding
th:cellspacing th:challenge th:charset
th:cite th:class th:classid ...
<input type="submit" value="Subscribe me!" th:value="#{subscribe.submit}"/>
<form action="subscribe.html" th:action="@{/subscribe}">
<li><a href="product/list.html" th:href="@{/product/list}">Product List</a></li>
設置多個屬性在同一時間 有兩個特殊的屬性能夠這樣設置: th:alt-title 和 th:lang-xmllang
th:alt-title 設置 alt 和 title
th:lang-xmllang 設置 lang 和 xml:lang
<img src="../../images/gtvglogo.png" th:attr="src=@{/images/gtvglogo.png},title=#{logo},alt=#{logo}" /> <img src="../../images/gtvglogo.png"th:src="@{/images/gtvglogo.png}" th:title="#{logo}" th:alt="#{logo}" /> <img src="../../images/gtvglogo.png"th:src="@{/images/gtvglogo.png}" th:alt-title="#{logo}" />
前置和後置添加屬性值 th:attrappend 和 th:attrprepend
<input type="button" value="Do it!" class="btn" th:attrappend="class=${' ' + cssStyle}" />
編譯後:
<input type="button" value="Do it!" class="btn warning" />
還有兩個特定的添加屬性 th:classappend 和 th:styleappend
<tr th:each="prod : ${prods}" class="row" th:classappend="${prodStat.odd}? 'odd'">
修復的布爾屬性
<input type="checkbox" name="active" th:checked="${user.active}" />
全部修復的布爾屬性:
|th:async |th:autofocus |th:autoplay |
|th:checked |th:controls |th:declare |
|th:default |th:defer |th:disabled |
|th:formnovalidate|th:hidden |th:ismap |
|th:loop |th:multiple |th:novalidate |
|th:nowrap |th:open |th:pubdate |
|th:readonly |th:required |th:reversed |
|th:scoped |th:seamless |th:selected |
HTML5友好的屬性及元素名
<table> <tr data-th-each="user : ${users}"> <td data-th-text="${user.login}">...</td> <td data-th-text="${user.name}">...</td> </tr> </table>
data-{prefix}-{name}是編寫HTML5自定義屬性的標準語法,不須要開發者使用th:*這樣的命名空間,Thymeleaf讓這種語法自動對全部dialect均可用。
6、遍歷
·基礎
<tr th:each="prod : ${prods}"> <td th:text="${prod.name}">Onions</td> <td th:text="${prod.price}">2.41</td> <td th:text="${prod.inStock}? #{true} : #{false}">yes</td> </tr>
可遍歷的對象:實現java.util.Iterable、java.util.Map(遍歷時取java.util.Map.Entry)、array、任何對象都被看成只有對象自身一個元素的列表
·狀態
<tr th:each="prod,iterStat : ${prods}" th:class="${iterStat.odd}? 'odd'"> <td th:text="${prod.name}">Onions</td> <td th:text="${prod.price}">2.41</td> <td th:text="${prod.inStock}? #{true} : #{false}">yes</td> </tr>
若不指定狀態變量,Thymeleaf會默認生成一個名爲「變量名Stat」的狀態變量:
<tr th:each="prod : ${prods}" th:class="${prodStat.odd}? 'odd'"> <td th:text="${prod.name}">Onions</td> <td th:text="${prod.price}">2.41</td> <td th:text="${prod.inStock}? #{true} : #{false}">yes</td> </tr>
7、條件運算
<tr th:each="prod : ${prods}" th:class="${prodStat.odd}? 'odd'"> <td th:text="${prod.name}">Onions</td> <td th:text="${prod.price}">2.41</td> <td th:text="${prod.inStock}? #{true} : #{false}">yes</td> <td> <span th:text="${#lists.size(prod.comments)}">2</span> comment/s <a href="comments.html" th:href="@{/product/comments(prodId=${prod.id})}" th:if="${not #lists.isEmpty(prod.comments)}">view</a> </td> </tr>
<a href="comments.html" th:href="@{/product/comments(prodId=${prod.id})}" th:if="${not #lists.isEmpty(prod.comments)}">view</a>
th:if 不僅運算布爾條件,它對如下狀況也運算爲true:
·值不爲null
值爲boolean且爲true
值爲數字且非0
值爲字符且非0
值是字符串且不是:「false」,「off」,「no」
值不是boolean、數字、字符、字符串
·若是值爲null,則th:if運算結果爲false
th:if的反面是th:unless
<a href="comments.html" th:href="@{/comments(prodId=${prod.id})}" th:unless="${#lists.isEmpty(prod.comments)}">view</a>
th:switch 和 th:case
<div th:switch="${user.role}"> <p th:case="'admin'">User is an administrator</p> <p th:case="#{roles.manager}">User is a manager</p> </div> <div th:switch="${user.role}"> <p th:case="'admin'">User is an administrator</p> <p th:case="#{roles.manager}">User is a manager</p> <p th:case="*">User is some other thing</p> </div>