1. 程式人生 > >Thymeleaf 快速入門(2)簡單表示式

Thymeleaf 快速入門(2)簡單表示式

2.1.1變量表達式:${…}
模板名稱:var.html 原理類似OGNL/SpringEL表示式
e.g.

1. Established locale country: <span th:text="${#locale.country}">US</span>
2. <p>  Today is: <span th:text="${#calendars.format(today,'dd MMMM yyyy')}">13 May 2011</span></p>

附:① Expression Basic Objects (表示式基本物件)
當對上下文變數評估OGNL表示式時,某些物件可用於表示式以獲得更高的靈活性。這些物件將被引用(按照OGNL標準),從#符號開始:

  • #ctx:上下文物件。
  • #vars: 上下文變數。
  • #locale:上下文區域設定。
  • #request:(僅在Web上下文中)HttpServletRequest物件。
  • #response:(僅在Web上下文中)HttpServletResponse物件
  • #session:(僅在Web上下文中)HttpSession物件。
  • #servletContext:(僅在Web上下文中)ServletContext物件。
    示例:
Established locale country: <span th:text="${#locale.country}">US</span>
② Expression Utility Objects(表示式實用物件)

除了這些基本的物件之外,Thymeleaf將為我們提供一組實用物件,這些物件將幫助我們在表示式中執行常見任務。

  • #execInfo:有關正在處理的模板的資訊。
  • #messages:在變量表達式中獲取外部化訊息的方法,與使用#{…}語法獲得的方式相同。
  • #uris:轉義URL / URI部分的方法
  • #conversions:執行配置的轉換服務(如果有)的方法。
  • #dates:java.util.Date物件的方法:格式化,元件提取等
  • #calendars:類似於#dates但是java.util.Calendar物件
  • #numbers:用於格式化數字物件的方法。
  • #strings:String物件的方法:contains,startsWith,prepending / appending等
  • #objects:一般物件的方法。
  • #bools:布林評估的方法。
  • #arrays:陣列方法。
  • #lists:列表的方法。
  • #sets:集合的方法。
  • #maps:地圖方法。
  • #aggregates:在陣列或集合上建立聚合的方法。
  • #ids:處理可能重複的id屬性的方法(例如,作為迭代的結果)。

2.1.2選擇性/星號表示式:*{…}
不僅可以將變量表達式寫為${…},也可以寫為*{…}。

有一個重要的區別:星號語法評估所選物件而不是整個上下文的表示式。也就是說,只要沒有選定的物件,美元和星號語法就會完全相同。

模板名稱:star.html

<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>

equals.

<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>

2.1.3 訊息表示式:#{…}
模板名稱:message.html message 國際化支援 語法格式:#{ }
e.g.

<p th:utext="#{home.welcome}">Welcome to our grocery store!</p>

2.1.4 連結表示式:@{…}
模板名稱:link.html
語法格式:@{ }
這裡寫圖片描述

示例:

<!-- 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>

下面針對不同型別網址做一詳細介紹

①.絕對URL(Absolute URLs) 開始通過指定協議名稱(包含http://或https://開頭)
e.g.
<a th:href="@{http://www.thymeleaf/documentation.html}"></a>
equals:
<a href="http://www.thymeleaf/documentation.html"></a>
②. 上下文相關的URL(Context-relative URLs) 最常用的如應用程式myapp的訪問地址:http://localhost:8080/myapp,那麼myapp就是上下文名稱。
e.g.<a th:href="@{/order/list}"></a>
equals:<a href="/myapp/order/list"></a>  
說明:“/”表示從應用程式根路徑開始訪問 ,去掉“/”表示相對路徑
③.相對於伺服器的URL(Server-relative URLs) 用法類似2,連線到同一伺服器不同應用程式中
e.g.
<a th:href="@{~/billing-app/showDetails.htm}"></a>
equals:
<a href="/billing-app/showDetails.htm"></a>
note:當前應用程式的上下文myapp將被忽略
④.協議相對URL(Protocol-relative URLs) 通常用於,包括外部資源,如樣式,指令碼等。保證協議(HTTP,HTTPS)用於顯示當前頁面的絕對URL。
e.g.
<script th:src="@{//scriptserver.example.net/myscript.js}">...</script>
equals:
<script src="//scriptserver.example.net/myscript.js">...</script>
⑤.帶引數的URL表示式
e.g.
1.<a th:href="@{/order/details(id=3)}"></a>
equals:
<a href="/order/details?id=3"></a>
2.攜帶多引數:<a th:href="@{/order/details(id=3,action='show_all')}"></a>
equals:
<a href="/order/details?id=3&action=show_all"></a>

2.1.5 片段表示式:~{…}

片段表示式的語法是非常簡單的。有三種不同的格式:

“~{templatename::selector}”包含在命名的模板上應用指定的標記選擇器導致的片段templatename。請注意,selector可以只是一個片段名稱,所以你可以指定~{templatename::fragmentname}像~{footer :: copy}上面那樣簡單的東西。
標記選擇器語法由底層的AttoParser解析庫定義,類似於XPath表示式或CSS選擇器。
“~{templatename}” 包括完整的模板命名templatename。
請注意,您在th:insert/ th:replacetags中使用的模板名稱必須由Template Engine當前使用的Template Resolver解析。
~{::selector}”或”~{this::selector}”包含同一模板的片段。
雙方templatename並selector在上面的例子可以是全功能的表示式(甚至條件語句!),如:

<div th:insert="footer :: (${user.isAdmin}? #{footer.admin} : #{footer.normaluser})"></div>

片段可以包括任何th:*屬性。一旦片段被包含在目標模板(具有th:insert/ th:replaceattribute)的模板中,這些屬性將被評估,並且它們將能夠引用此目標模板中定義的任何上下文變數。

這種分片方法的一大優點是,您可以將頁面中的片段寫入瀏覽器完美顯示的頁面,並具有完整而有效的標記結構,同時仍保留使Thymeleaf包含在其他模板中的功能。