1. 程式人生 > >thymeleaf部分總結

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,可以是:
  1. Page-relative,如,user/login.html
  2. Context-relative,如,/itemdetails?id=3(服務端自動會加上下文名稱)
  3. Server-relative,如,~/billing/processInvoice(允許在同一伺服器的不同上下文[如application]中呼叫這些URL)
  4. 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>

注意:

  1. th:href是一個修飾符屬性:處理完之後,它將計算要使用的連結URL,並將該值設定為<a>標記的href屬性。
  2. 可為URL引數使用表示式(在orderId=${o.id}中),所需的URL引數編碼操作也會自動執行。
  3. 用逗號分隔多個引數:@{/order/process(execId=${execId},execType='FAST')}
  4. 在URL路徑中允許使用變數模板:@{/order/{orderId}/details(orderId=${orderId})}
  5. 以/(如/order/details)開頭的相對URL將自動以應用程式上下文名稱作為字首。
  6. 如果不啟用cookie,或者還不知道,可能會將";jsessionid=.."字尾新增到相對URL中,以便儲存會話。這就是所謂的URL重寫,Thymeleaf允許您插入自己的重寫過濾器,方法是通過Servlet API為每個URL使用response.encodeURL()機制。
  7. 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,表示式預處理