(二)Thymeleaf標准表達式之——簡單表達式


2. 標准表達式(Standard Expression Syntax)

標准表達式包含以下幾個方面:
  • 簡單表達式:
    • 變量表達式: ${...}
    • 選擇變量表達式: *{...}
    • 消息表達式: #{...}
    • 鏈接網址表達式: @{...}
    • 片段表達式: ~{...}
  • 字面
    • 文本文字:'one text''Another one!',...
    • 數字文字:0343.012.3,...
    • 布爾文字:truefalse
    • 空字面: null
    • 文字標記:onesometextmain,...
  • 文字操作:
    • 字符串連接: +
    • 文字替代: |The name is ${name}|
  • 算術運算:
    • 二元運算符:+-*/%
    • 減號(一元運算符): -
  • 布爾運算:
    • 二元運算符:andor
    • 布爾否定(一元運算符): !not
  • 比較和相等:
    • 比較:><>=<=gtltgele
    • 相等判斷:==!=eqne
  • 條件運算符:
    • IF-THEN: (if) ? (then)
    • IF-THEN-ELSE: (if) ? (then) : (else)
    • 默認: (value) ?: (defaultvalue)
  • 特殊令牌:
    • 無操作: 

下面將分別介紹:

2.1 簡單表達式

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:執行配置的轉換服務(如果有)的方法。
  • #datesjava.util.Date對象的方法:格式化,組件提取等
  • #calendars:類似於#dates但是java.util.Calendar對象。
  • #numbers:用於格式化數字對象的方法。
  • #stringsString對象的方法:contains,startsWith,prepending / appending等
  • #objects:一般對象的方法。
  • #bools:布爾評估的方法。
  • #arrays:數組方法。
  • #lists:列表的方法。
  • #sets:集合的方法。
  • #maps:地圖方法。
  • #aggregates:在數組或集合上創建聚合的方法。
  • #ids:處理可能重復的id屬性的方法(例如,作為迭代的結果)。

2.1.2選擇性/星號表達式:*{...}

不僅可以將變量表達式寫為${...},也可以寫*{...}

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

模板名稱:star.html
e.g.
 <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}"包含同一模板的片段。

雙方templatenameselector在上面的例子可以是全功能的表達式(甚至條件語句!),如:

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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM