首页 > 解决方案 > Thymeleaf 带有锚点的链接 url 表达式

问题描述

我需要用锚在百里香中创建一个网址。像:

/import#34546

但是链接 url 表达式不起作用。

<a th:href="@{import#{id}(id=${object.id}}">link</a>

有人使用 thymeleaf 获取此网址?

我将百里香与 spring-boot 2.5.4 一起使用。

谢谢!

标签: spring-bootspring-mvcurlthymeleaf

解决方案


概括

Thymeleaf 不支持使用表达式来评估 URL 片段。它假定片段将被硬编码。

因此,我建议您@{...}对片段以外的所有内容使用语法组合,然后使用字符串连接来构建带有 Thymeleaf${...}表达式的片段。

一个例子(还有其他方法可以进行连接):

<a th:href="@{import} + ${'#' + object_id}">link</a>

这使您仍然可以利用 的功能@{...},例如处理绝对和相对 URL。

细节

查看该类的 Thymeleaf 源代码StandardLinkBuilder,我们可以看到如何处理URL 片段#及其后续片段标识符)。

需要注意的点是:

URL 的片段部分在此处提取:

urlFragment = linkBase.substring(hashPosition);

哈希位置是#URL 字符串中 a 的位置。

然后从 URL 字符串中删除此子字符串:

linkBase.delete(hashPosition, linkBase.length());

稍后(参见此处),在处理完所有其他参数后,将 urlFragment 添加回 URL,保持不变:

linkBase.append(urlFragment);

因此,没有处理 URL 片段的 Thymeleaf 表达式变量 - 它只是被视为“硬编码”字符串。

这意味着您可以执行以下操作,其中#foo硬编码:

<a th:href="@{import/{id}#foo(id=${object_id})}">link</a>

但是您不能这样做(并获得所需的结果):

<a th:href="@{import/{id_a}#{id_b}(id_a=${object_id},id_b=${object_id})}">link</a>

推荐阅读