Thymeleaf標準URL語法

Thymeleaf標準方言(稱爲Standard和SpringStandard)提供了一種在Web應用程序中輕鬆創建URL的方法,以便它們包含任何所需的URL工件。 這是通過連接表達方式來完成的,這是一種類似於Thymeleaf標準的表現:@{...}

1. 絕對網址

絕對URL用於創建到其他服務器的鏈接。它們需要指定一個協議名稱(http://https://)開頭。

<a th:href="@{https://www.yiibai.com/thymeleaf/}">

上面鏈接不會被修改,除非在服務器上配置了URL重寫過濾器,並在HttpServletResponse.encodeUrl(...)方法中執行修改。最後生成的HTML代碼如下:

<a href="https://www.yiibai.com/thymeleaf/">

2. 上下文相關URL

最常用的URL類型是上下文相關的。 這些URL是一旦安裝在服務器上,就會與Web應用程序根相關聯URL。 例如,如果將一個名稱爲myapp.war的文件部署到一個Tomcat服務器中,那麼應用程序一般是通過URL:http://localhost:8080/myapp來訪問,myapp就是上下文名稱。

與上下文相關的URL以/字符開頭:

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

如果應用程序訪問URL爲:http://localhost:8080/myapp,則此URL將輸出:

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

3. 與服務器相關URL

服務器相關的URL與上下文相關的URL非常相似,只是它們不假定URL要鏈接到應用程序上下文中的資源,因此允許鏈接到同一服務器中的不同上下文:

<a th:href="@{~/billing-app/showDetails.html}">

當前應用程序的上下文將被忽略,因此儘管應用程序部署在http:// localhost:8080 / myapp,但該URL將輸出:

<a href="/billing-app/showDetails.html">

4. 協議相關URL

與協議相關的URL實際上是絕對的URL,它將保持用於顯示當前頁面的協議(HTTP,HTTPS)。 它們通常用於包括樣式,腳本等外部資源:

<script th:src="@{//scriptserver.example.net/myscript.js}">...</script>

它將呈現與上面一致的URL(URL重寫除外),如:

<script src="//scriptserver.example.net/myscript.js">...</script>

5. 添加參數

如何向使用@{...}表達式創建的URL添加參數? 這也很簡單:

<a th:href="@{/order/details(id=3)}">

上面示例代碼,最終將輸出爲:

<a href="/order/details?id=3">

也可以添加幾個參數,用逗號分隔它們:

<a th:href="@{/order/details(id=3,action='show_all')}">

上面代碼將輸出結果爲:

<!-- 注意&符號在標籤屬性中進行HTML轉義... -->
<a href="/order/details?id=3&action=show_all">

還可以使用正常參數的路徑變量的形式包含參數,但在URL的路徑中指定一個佔位符:

<a th:href="@{/order/{id}/details(id=3,action='show_all')}">

上面輸出結果爲:

<a href="/order/3/details?action=show_all">

6. 網址片段標識符

片段標識符可以包含在URL中,包含參數和不包含參數。 它們將始終包含在網址的基礎上,參考以下代碼:

<a th:href="@{/home#all_info(action='show')}">

執行輸出結果如下 -

<a href="/home?action=show#all_info">

7. URL重寫

Thymeleaf允許在應用程序中配置URL重寫過濾器,它通過調用Thymeleaf模板生成的每個URL的Servlet API的javax.servlet.http.HttpServletResponse類中的response.encodeURL()方法來實現。

下面在Java Web應用程序中支持URL重寫操作的標準方式,並允許URL:

  • 自動檢測用戶是否啓用了Cookie,如果未啓用或者如果它是第一個請求並且cookie配置仍未知。則將;jsessionid=...片段添加到URL。
  • 在需要時自動將代理配置應用於URL。
  • 使用不同的CDN設置,以便鏈接到分佈在多個服務器中的內容。

8. URL其它屬性

不要以爲在@{...}表達式中只有th:href屬性來表示URL 。 事實上,它們可以像變量表達式(${...})或消息外部化/國際化(#{...})一樣用於任何地方。

例如,表單提交時,可使用以下寫法 -

<form th:action="@{/order/processOrder}">

或作爲其他表達的一部分。 如下作爲外部化/國際化字符串的參數:

<p th:text="#{orders.explanation('3', @{/order/details(id=3,action='show_all')})}">

9. 在URL中使用表達式

下面來看看,如下所示的URL表達式:

<a th:href="@{/order/details(id=3,action='show_all')}">

3'show_all'都不能是文字值,因爲只有在運行時才能知道它們的值,怎麼辦?

<a th:href="@{/order/details(id=${order.id},action=(${user.admin} ? 'show_all' : 'show_public'))}">

下面看看另一個URL表達式,如下所示:

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

它其實是下面URL的一個快捷方式:

<a th:href="@{'/order/details'(id=${order.id})}">

這意味着URL基本身可以被指定爲一個表達式,例如一個變量表達式:

<a th:href="@{${detailsURL}(id=${order.id})}">

或外部化/國際化的文本:

<a th:href="@{#{orders.details.localized_url}(id=${order.id})}">

甚至可以使用複雜的表達式,包括條件表達式,例如:

<a th:href="@{(${user.admin}? '/admin/home' : ${user.homeUrl})(id=${order.id})}">

如果要更清潔,那麼可以使用th:with :

<a th:with="baseUrl=(${user.admin}? '/admin/home' : ${user.homeUrl})"
  th:href="@{${baseUrl}(id=${order.id})}">

又或者 -

<div th:with="baseUrl=(${user.admin}? '/admin/home' : ${user.homeUrl})">
  ...
  <a th:href="@{${baseUrl}(id=${order.id})}">...</a>
  ...
</div>