thymeleaf部分總結
基於 3.0.9.RELEASE的文件,部分總結,不全。
1,簡單表示式
1.1,變量表達式${}
變量表達式是對包含在上下文的變數map上執行的OGNL表示式。在Spring中,支援mvc的應用程式OGNL將被SpringEL所取代,但它的語法與OGNL非常相似。
從OGNL的語法中,我們知道:
<p>Today is: <span th:text="${today}">13 february 2011</span>.</p>
實際上等價於:
ctx.getVariable("today");
不過,OGNL允許建立更強大的表示式,這就是為什麼下面的表示式:
<p th:utext="#{home.welcome(${session.user.name})}">
Welcome to our grocery store, Sebastian Pepper!
</p>
通過執行以下命令,能夠獲得使用者名稱:
((User) ctx.getVariable("session").get("user")).getName();
但是,getter方法的呼叫方式只是OGNL的特性之一。
1.1.1,基本表示式物件
當在上下文變數上計算OGNL表示式時,為了獲得更高的靈活性,可以將一些物件提供給表示式。這些物件將通過#引用(按照OGNL標準)。
#ctx,the context object.
#vars,the context variables.
#locale,the context locale.
#request,(only in Web Contexts) the HttpServletRequest object.
#response,(only in Web Contexts) the HttpServletResponse object.
#session,(only in Web Contexts) the HttpSession object.
#servletContext,(only in Web Contexts) the ServletContext object.
例如:
Established locale country: <span th:text="${#locale.country}">US</span>.
1.1.2,工具表示式物件
除了基本物件之外,Thymeleaf還提供了一組實用程式物件,幫助我們在表示式中執行常見任務。
#execInfo,information about the template being processed.
#messages,methods for obtaining externalized messages inside variables expressions, in the same way as they would be obtained using #{…} syntax.
#uris,methods for escaping parts of URLs/URIs
#conversions,methods for executing the configured conversion service (if any).
#dates,methods for java.util.Date objects: formatting, component extraction, etc.
#calendars,analogous to #dates, but for java.util.Calendar objects.
#numbers,methods for formatting numeric objects.
#strings,methods for String objects: contains, startsWith, prepending/appending, etc.
#objects,methods for objects in general.
#bools,methods for boolean evaluation.
#arrays,methods for arrays.
#lists,methods for lists.
#sets,methods for sets.
#maps,methods for maps.
#aggregates,methods for creating aggregates on arrays or collections.
#ids,methods for dealing with id attributes that might be repeated (for example, as a result of an iteration).
例子:
<p>Today is: <span th:text="${today}">13 february 2011</span>.</p>
其中,"13 february 2011"只是對today變數的說明,不管today的值是否為空,today都不會被其替換掉。若要使用預設表示式,可用下例:
<p>Today is: <span th:text="(${test} == null) ? 'test為空的預設值' : 'test不為空的預設值'">13 february 2011</span>.</p>
1.2,選擇變量表達式*{}
變量表達式不僅可以寫成${},還可以寫成*{}。
不過,有一個重要區別:星號語法計算的是選定物件的表示式,而不是整個上下文。也就是說,只要沒有選定物件,【$】和【*】語法就完全相同。
使用th:object屬性的表示式就是選擇物件。例如:
<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>
當然,【$】和【*】語法可以混合使用。
<div th:object="${session.user}">
<p>Name: <span th:text="*{firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>
當物件選擇就緒時,選中的物件也可以作為#object表示式變數提供給$表示式。
<div th:object="${session.user}">
<p>Name: <span th:text="${#object.firstName}">Sebastian</span>.</p>
<p>Surname: <span th:text="${session.user.lastName}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{nationality}">Saturn</span>.</p>
</div>
如前所述,如果沒有進行物件選擇,則【$】和【*】語法是等效的。
<div>
<p>Name: <span th:text="*{session.user.name}">Sebastian</span>.</p>
<p>Surname: <span th:text="*{session.user.surname}">Pepper</span>.</p>
<p>Nationality: <span th:text="*{session.user.nationality}">Saturn</span>.</p>
</div>
1.3,訊息(i18n)表示式#{}
訊息表示式(通常稱為文字外部化,國際化或i18n)允許從外部源(如:.properties)檔案中檢索特定於語言環境的訊息,通過鍵來引用訊息內容。
在Spring應用程式中,它將自動與Spring的MessageSource機制整合。如下:
#{main.title}
#{message.entrycreated(${entryId})}
以下是在模板中使用的方式:
<table>
...
<th th:text="#{header.address.city}">...</th>
<th th:text="#{header.address.country}">...</th>
...
</table>
請注意,如果希望訊息鍵由上下文變數的值確定,或者希望將變數指定為引數,則可以在訊息表示式中使用變量表達式:
#{${config.adminWelcomeKey}(${session.user.name})}
1.4,連結(URL)表示式@{}
由於URL的重要性,它們是web應用程式模板中的頭等元素,Thymeleaf標準方言有特殊的語法處理。
下面是不同型別的URL:
- 絕對地址的URLs,如http://www.thymeleaf.org
- 相對地址的URLs,可以是:
- Page-relative,如,user/login.html
- Context-relative,如,/itemdetails?id=3(服務端自動會加上下文名稱)
- Server-relative,如,~/billing/processInvoice(允許在同一伺服器的不同上下文[如application]中呼叫這些URL)
- Protocol-relative URLs,如,//code.jquery.com/jquery-2.0.3.min.js
這些表示式的實際處理以及它們對將要輸出的url的轉換是通過實現org.thymeleaf.linkbuilder.ILinkBuilder介面完成的,該介面註冊到使用ITemplateEngine的物件上。
預設情況下,這個介面的單個實現註冊了org.thymeleaf.linkbuilder.StandardLinkBuilder類,這對於離線(非web)和基於Servlet API的web場景都足夠了。其它場景(比如與非servlet api web框架的整合)可能需要連結構建器介面的特定實現。
讓我們使用這個新語法。滿足th:href的屬性:
<!-- 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引數使用表示式(在orderId=${o.id}中),所需的URL引數編碼操作也會自動執行。
- 用逗號分隔多個引數:@{/order/process(execId=${execId},execType='FAST')}
- 在URL路徑中允許使用變數模板:@{/order/{orderId}/details(orderId=${orderId})}
- 以/(如/order/details)開頭的相對URL將自動以應用程式上下文名稱作為字首。
- 如果不啟用cookie,或者還不知道,可能會將";jsessionid=.."字尾新增到相對URL中,以便儲存會話。這就是所謂的URL重寫,Thymeleaf允許您插入自己的重寫過濾器,方法是通過Servlet API為每個URL使用response.encodeURL()機制。
- th:href屬性允許在模板中(可選地)有一個正在工作的靜態href屬性,這樣當為原型設計而直接開啟模板連結時,仍然可以被瀏覽器導航。
和訊息語法(#{…})一樣,URL也可以作為計算另一個表示式的結果的基礎元素:
<a th:href="@{${url}(orderId=${o.id})}">view</a>
<a th:href="@{'/details/'+${user.login}(orderId=${o.id})}">view</a>
1.4.1,首頁選單
在主頁上為站點中的其它頁面新增一個選單。
<p>Please select an option</p>
<ol>
<li><a href="product/list.html" th:href="@{/product/list}">Product List</a></li>
<li><a href="order/list.html" th:href="@{/order/list}">Order List</a></li>
<li><a href="subscribe.html" th:href="@{/subscribe}">Subscribe to our Newsletter</a></li>
<li><a href="userprofile.html" th:href="@{/userprofile}">See User Profile</a></li>
</ol>
1.4.2,伺服器root相對url
可以使用額外的語法建立伺服器root相對url(而不是上下文root相對url),以便連結到同一伺服器中的不同上下文。這些url被指定為@{~/path/to/something}
1.5,片段表示式~{}
片段表示式是表示標記(markup)片段並在模板中移動它們的一種簡單方法。可以複製它們,將它們作為引數傳遞給其它模板。
最常見的用法是使用th:insert或th:replace插入片段:
<div th:insert="~{commons :: main}">...</div>
它們可以在任何地方使用,就像任何其它變數一樣:
<div th:with="frag=~{footer :: #main/text()}">
<p th:insert="${frag}">
</div>
在後面有一個專門介紹模板佈局的部分,其中包括對片段表示式的更深入解釋。
片段表示式可以有引數。
1.6,字面量
1.7,附加文字
1.8,字面量替換
1.9,算術運算
1.10,比較運算
1.11,條件表示式
1.12,預設表示式(Elvis運算子)
1.13,無操作令牌
1.14,資料轉換/格式化
1.15,表示式預處理