thymeleaf學習(一)

HydraSong發表於2021-04-10

標準表示式語法

  • ${...}:變數表示式
  • *{...}:選擇表示式
  • \#{...}:訊息(i18n)表示式
  • @{...}:URL表示式
  • ~{...}:片段表示式

變數表示式

將Thymeleaf與Spring整合-在上下文變數(在Spring行話中也稱為 Spring jargon)上執行

OGNL表示式長這樣 :

${session.user.name}

他們可以作為屬性的值,像這樣:

<span th:text="${book.author.name}">

以上程式碼和這樣是相等的(OGNL和SpEL語言)

((Book)context.getVariable("book")).getAuthor().getName()

我們可以使用迭代訪問變數

<li th:each="book : ${books}">

$ {books}從上下文中選擇稱為books的變數,並將其評估為可迭代的變數,以在th:each迴圈中使用

選擇表示式

選擇表示式和變數表示式類似,而選擇表示式只能在先前選擇的物件上執行,不能全域性執行
選擇表示式長這樣:

*{customer.name}

它們作用的物件由th:object屬性指定

<div th:object="${book}">
  ...
  <span th:text="*{title}">...</span>
  ...
</div>

等效於:

{
  // th:object="${book}"
  final Book selection = (Book) context.getVariable("book");
  // th:text="*{title}"
  output(selection.getTitle());
}

訊息表示式

經常稱為text externalization, internationalization或者 i18n
訊息表示式允許我們從.properties檔案中檢索特定於語言環境的訊息,透過鍵引用它們,並可選地應用一組引數。
他們長這樣:

#{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})}

連結表示式

連結表示式用於構建URL並向其新增有用的上下文和會話資訊(此過程通常稱為URL重寫)
一個網頁應用部署在你的web伺服器的myapp上下文,表示式長這樣:

<a th:href="@{/order/list}">...</a>

他會被轉換為:

<a href="/myapp/order/list">...</a>

如果我們需要保留會話且未啟用Cookie(或伺服器尚不知道),請執行以下操作

<a href="/myapp/order/list;jsessionid=23fa31abd41ea093">...</a>

URL還可以加入變數

<a th:href="@{/order/details(id=${orderId},type=${orderType})}">...</a>

他實際是會被轉換為這樣的:

<!-- Note ampersands (&) should be HTML-escaped in tag attributes... -->
<a href="/myapp/order/details?id=23&amp;type=online">...</a>

URL表示式可以是相對的,在這種情況下,沒有應用程式上下文將作為URL的字首:

<a th:href="@{../documents/report}">...</a>

也可以是伺服器的相對(同樣也沒有URL字首)

<a th:href="@{~/contents/main}">...</a>

相對協議(與絕對URL相同,但瀏覽器將使用與所顯示頁面相同的HTTP或HTTPS協議):

<a th:href="@{//static.mycompany.com/res/initial}">...</a>

url表示式也當然可以是絕對的

<a th:href="@{http://www.mycompany.com/main}">...</a>

片段表示式

片段表示式是表示標記片段並在模板中使用它們的簡單方法。
最常見的用途是使用th:insert或th:replace插入片段:

<div th:insert="~{commons :: main}">...</div>

可以在任何地方使用,像變數一樣

<div th:with="frag=~{footer :: #main/text()}">
  <p th:insert="${frag}">
</div>

字面量和方法

  • 字面量:

    * 文字字面量:'one text', 'Another one!'
    * 數字字面量:0, 34, 3.0, 12.3,
    * 布林字面量:true,false
    * 空關字面量:null
  • 文字操作:

    *   String concatenation: +
    *   Literal substitutions: |The name is ${name}|
  • 數學操作:

    *   Binary operators: +, -, *, /, %
    *   Minus sign (unary operator): -
  • 布林運算子:

    *   Binary operators: and, or
    *   Boolean negation (unary operator): !, not
  • 比較和相等:

    *   Comparators: >, <, >=, <= (gt, lt, ge, le)
    *   Equality operators: ==, != (eq, ne)
  • 條件操作:

    *   If-then: (if) ? (then)
    *   If-then-else: (if) ? (then) : (else)
    *   Default: (value) ?: (defaultvalue)
    

表示式預處理

預處理看起來像這樣

#{selection.__${sel.code}__}

我們看到的是一個表示式${sel.code},他將被預先執行,然後將其結果(假如是ALL)selection.ALL返回

一些基本屬性

th:text替換標籤的文字

<p th:text="#{msg.welcome}">Welcome everyone!</p>

th:each和Java的forEach相同

<li th:each="book : ${books}" th:text="${book.title}">En las Orillas del Sar</li>

Thymeleaf模仿的特定的XHTML和HTML5屬性th:action, th:value, th:href

<form th:action="@{/createOrder}">
<input type="button" th:value="#{form.submit}" />
<a th:href="@{/admin/users}">

相關文章