You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Thymeleaf构建包含请求参数的URL路径?

解决Thymeleaf链接生成错误及控制器匹配问题

看起来你在Thymeleaf链接生成和Spring MVC控制器映射上绕了弯路,我来帮你理清楚:

首先先明确核心需求:你的控制器映射的是/item/comments并接收id请求参数,所以正确的目标链接应该是**http://localhost:8080/item/comments?id=1**——你之前写的http://localhost:8080/item?id=1/comments格式本身是错误的,/comments不应该跟在参数后面。

为什么你的写法会生成多余的#?

你原来的Thymeleaf代码:

<a th:href="@{item#/comments(id=${item.id})}" th:text="${item.title}"></a>

这里的#是Thymeleaf用来标记页面锚点的符号,它会把/comments解析成页面内的锚点部分,而id参数会被附加到item路径后面,最终生成不符合预期的item?id=1#/comments。

正确的Thymeleaf写法(匹配现有控制器)

根据你当前的控制器代码,直接修改链接生成逻辑即可:

<a th:href="@{/item/comments(id=${item.id})}" th:text="${item.title}"></a>

这样生成的URL就是http://localhost:8080/item/comments?id=1,完美匹配你的@GetMapping("/item/comments")控制器,服务器能正确接收id参数。

更推荐的RESTful风格写法(可选优化)

如果你想让URL更符合现代Web开发的REST规范(比如http://localhost:8080/item/1/comments),可以同步调整控制器和Thymeleaf代码:

  1. 修改控制器为路径变量接收参数:
@GetMapping(value = "/item/{id}/comments")
public String showItemComments(@PathVariable Long id, Model model) {
    // do something...
}
  1. 对应的Thymeleaf写法:
<a th:href="@{/item/{id}/comments(id=${item.id})}" th:text="${item.title}"></a>

这种URL结构更直观,也更符合资源定位的设计原则。

关于错误链接的控制器接收问题

你之前生成的错误链接http://localhost:8080/item?id=1#/comments,服务器是无法正确处理的:

  • 锚点#/comments不会被发送到服务器,服务器只能识别到请求路径是/item,参数是id=1
  • 你的控制器映射的是/item/comments,路径不匹配,所以这个请求会被处理/item的控制器接收(如果存在的话),根本到不了你的showItemComments方法。

内容的提问来源于stack exchange,提问作者Geha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:19:28