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>
我需要在带有锚点的 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>