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>