Thymeleaf標準URL語法


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

1. 絕對網址

絕對URL用於建立到其他伺服器的連結。它們需要指定一個協定名稱(http://https://)開頭。

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

上面連結不會被修改,除非在伺服器上組態了URL重寫過濾器,並在HttpServletResponse.encodeUrl(...)方法中執行修改。最後生成的HTML程式碼如下:

<a href="https://www.tw511.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>