ThymeleafURL
简介
Thymeleaf标准方言(称为Standard和SpringStandard)提供了一种在Web应用程序中轻松创建URL的方法,以便它们包含任何所需的URL工件。 这是通过连接表达方式来完成的,这是一种类似于Thymeleaf标准的表现:@{…}
1. 绝对网址 @{https://~} (基于协议的标准网址)
绝对URL用于创建到其他服务器的链接。它们需要指定一个协议名称(http://或https?/)开头。
<a th:href="@{https://www.e-learn.cn/thymeleaf/}">
上面链接不会被修改,除非在服务器上配置了URL重写过滤器,并在HttpServletResponse.encodeUrl(…)方法中执行修改。最后生成的HTML代码如下:
<a href="https://www.e-learn.cn/thymeleaf/">
2. 上下文相关URL 以’/'字符开头 (根据应用上下文补全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实际上是绝对的URL,它将保持用于显示当前页面的协议(HTTP,HTTPS)。 它们通常用于包括样式,脚本等外部资源:
<script th:src="@{//scriptserver.example.net/myscript.js}">...</script>
它将呈现与上面一致的URL(URL重写除外),如:
<script src="//scriptserver.example.net/myscript.js">...</script>
5. 添加参数 (URL传值)
如何向使用@{…}表达式创建的URL添加参数? 这也很简单:
<a th:href="@{/order/details(id=3)}">
上面示例代码,最终将输出为:
<a href="/order/details?id=3">
也可以添加几个参数,用逗号分隔它们:
<a th:href="@{/order/details(id=3,action='show_all')}">
上面代码将输出结果为:
<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. 网址片段标识符 #name (用于页面自动翻滚到相应元素)
片段标识符可以包含在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>