Skip to content

服务器根相对URL

Thymeleaf 还提供了一种额外的语法,用于创建服务器根相对 URL(而非上下文根相对 URL),以便链接到同一服务器下的其他应用(不同上下文)。这类 URL 的写法为:@{~/path/to/something}

核心概念区分

首先明确两个关键概念的差异,帮助你理解何时该用服务器根相对 URL:

URL 类型语法示例解析规则适用场景
上下文根相对 URL@{/product/list}自动拼接当前应用的上下文路径(如 /gtvg/product/list访问当前应用内的资源
服务器根相对 URL@{~/billing/process}直接基于服务器根路径,拼接目标应用的上下文路径(如 /billing/process访问同服务器下其他应用的资源

实际使用示例

假设你的服务器上部署了两个应用:

  • 主应用:上下文路径为 /gtvg(杂货铺业务);
  • 账单应用:上下文路径为 /billing(独立的账单系统)。

若要在主应用中链接到账单应用的接口,就可以使用服务器根相对 URL:

html
<!-- 服务器根相对 URL:直接指向 /billing/processInvoice,而非 /gtvg/billing/processInvoice -->
<a href="billing.html" th:href="@{~/billing/processInvoice(invoiceId=${o.id})}">
  Process Invoice
</a>

关键注意事项

  1. 路径解析逻辑@{~/billing/processInvoice} 中的 ~ 表示“跳过当前应用的上下文路径”,直接从服务器根路径(/)开始解析,最终生成 /billing/processInvoice,而非 /gtvg/billing/processInvoice

  2. 跨应用访问的前提: 该语法仅适用于同一服务器下的不同应用,且目标应用的上下文路径(如 /billing)需在服务器中正确配置,否则链接会失效。

  3. 参数与编码兼容: 服务器根相对 URL 同样支持动态参数和自动编码,例如:

    html
    <a th:href="@{~/billing/process(invoiceId=${o.id},type='URGENT')}">Process</a>

    会生成 /billing/process?invoiceId=123&type=URGENT,参数仍会自动 URL 编码。

总结

  1. @{~/path} 是服务器根相对 URL 的专属语法,用于访问同服务器下其他应用的资源,区别于访问当前应用的 @{/path}
  2. 核心差异在于 ~ 符号:跳过当前应用上下文,直接基于服务器根路径解析,避免拼接当前应用的上下文路径。
  3. 该语法兼容动态参数和自动编码,仅需关注目标应用的上下文路径配置,无需额外处理路径拼接。