Thymeleaf标准方言(称为Standard和SpringStandard)提供了一种在Web应用程序中轻松创建URL的方法,以便它们包含任何所需的URL工件。 这是通过连接表达方式来完成的,这是一种类似于Thymeleaf标准的表现:@{...}
1. 绝对网址
绝对URL用于创建到其他服务器的链接。它们需要指定一个协议名称(http://
或https://
)开头。
<a th:href="@{https://www.voidme.com/thymeleaf/}">
上面链接不会被修改,除非在服务器上配置了URL重写过滤器,并在HttpServletResponse.encodeUrl(...)
方法中执行修改。最后生成的HTML代码如下:
<a href="https://www.voidme.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>