Thymeleaf Link url 带锚点的表达式

Thymeleaf Link url expression with anchor

我需要在带有锚点的 thymeleaf 中创建一个 url。喜欢:

/import#34546

但是 link url 表达式不起作用。

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

有人用 thymeleaf 得到这个 url 吗?

我将 thymeleaf 与 spring-boot 2.5.4 一起使用。

谢谢!

总结

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

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

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

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

这允许您仍然利用 @{...} 的功能,例如处理绝对和相对 URLs。

详情

查看 StandardLinkBuilder class, we can see how URL fragments# 及其后续片段标识符)的 Thymeleaf 源代码。

注意事项有:

提取 URL 的片段部分 here:

urlFragment = linkBase.substring(hashPosition);

散列位置是 URL 字符串中 # 的位置。

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

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

稍后(参见here),在处理完所有其他参数后,将 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>