Thymeleaf標準方言(稱為Standard和SpringStandard)提供了一種在Web應用程式中輕鬆建立URL的方法,以便它們包含任何所需的URL工件。 這是通過連線表達方式來完成的,這是一種類似於Thymeleaf標準的表現:@{...}
絕對URL用於建立到其他伺服器的連結。它們需要指定一個協定名稱(http://
或https://
)開頭。
<a th:href="@{https://www.tw511.com/thymeleaf/}">
上面連結不會被修改,除非在伺服器上組態了URL重寫過濾器,並在HttpServletResponse.encodeUrl(...)
方法中執行修改。最後生成的HTML程式碼如下:
<a href="https://www.tw511.com/thymeleaf/">
最常用的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">
伺服器相關的URL與上下文相關的URL非常相似,只是它們不假定URL要連結到應用程式上下文中的資源,因此允許連結到同一伺服器中的不同上下文:
<a th:href="@{~/billing-app/showDetails.html}">
當前應用程式的上下文將被忽略,因此儘管應用程式部署在http:// localhost:8080 / myapp
,但該URL將輸出:
<a href="/billing-app/showDetails.html">
與協定相關的URL實際上是絕對的URL,它將保持用於顯示當前頁面的協定(HTTP,HTTPS)。 它們通常用於包括樣式,指令碼等外部資源:
<script th:src="@{//scriptserver.example.net/myscript.js}">...</script>
它將呈現與上面一致的URL(URL重寫除外),如:
<script src="//scriptserver.example.net/myscript.js">...</script>
如何向使用@{...}
表示式建立的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">
片段識別符號可以包含在URL中,包含引數和不包含引數。 它們將始終包含在網址的基礎上,參考以下程式碼:
<a th:href="@{/home#all_info(action='show')}">
執行輸出結果如下 -
<a href="/home?action=show#all_info">
Thymeleaf允許在應用程式中組態URL重寫過濾器,它通過呼叫Thymeleaf模板生成的每個URL的Servlet API的javax.servlet.http.HttpServletResponse
類中的response.encodeURL()
方法來實現。
下面在Java Web應用程式中支援URL重寫操作的標準方式,並允許URL:
;jsessionid=...
片段新增到URL。不要以為在@{...}
表示式中只有th:href
屬性來表示URL 。 事實上,它們可以像變數表示式(${...}
)或訊息外部化/國際化(#{...}
)一樣用於任何地方。
例如,表單提交時,可使用以下寫法 -
<form th:action="@{/order/processOrder}">
或作為其他表達的一部分。 如下作為外部化/國際化字串的引數:
<p th:text="#{orders.explanation('3', @{/order/details(id=3,action='show_all')})}">
下面來看看,如下所示的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>