Thymeleaf标准URL语法

Thymeleaf标准方言(称为Standard和SpringStandard)提供了一种在Web应用程序中轻松创建URL的方法,以便它们包含任何所需的URL工件。 这是通过连接表达方式来完成的,这是一种类似于Thymeleaf标准的表现:@{...}

1. 绝对网址

绝对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是一旦安装在服务器上,就会与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>