如何替换 thymeleaf 链接中的 URL 参数?
Posted
技术标签:
【中文标题】如何替换 thymeleaf 链接中的 URL 参数?【英文标题】:How to replace URL parameters in a thymeleaf link? 【发布时间】:2018-01-17 13:17:02 【问题描述】:我有一个带有获取参数的现有 URL。单击按钮时,我想更改一个特定的 URL 参数,但保留其他参数。这可能吗?
Thymeleaf 模板:
<a th:href="@/order/details(id=3)">
结果:
<a href="/order/details?id=3">
如果我想怎么办
在 URL 中保留其他参数 覆盖id
参数?
上述百里香模板的期望结果:
localhost:8080/order/details?name=test&id=3
最好没有javascript。
【问题讨论】:
“点击按钮”是什么意思?将请求发送到服务器?还是只是想直接更改链接中的参数? 两者。我有一个 所以,应该使用 JS 来完成。不是百里香 请看这个answer。它应该符合您的需求。 【参考方案1】:即使这是一个较老的问题,我希望这仍然可以帮助:
<a th:href="@$urlBuilder.replaceQueryParam('id', 3).build().toUriString()" th:with="urlBuilder=$T(org.springframework.web.servlet.support.ServletUriComponentsBuilder).fromCurrentRequest()">
这将构建一个完整的 URI 字符串,包括 HTTP(S) 部分。因此,如果您(例如)为您的 Web 应用程序使用负载均衡器并且它不直接转发 https 请求,您将得到一个错误的 URI 字符串。在这种情况下,您必须像Zico 写道:在控制器中设置baseUrl 并将其绑定到模板。
您还可以从当前请求中获取查询字符串:request.getQueryString()
或在控制器中使用 ServletUriComponentsBuilder
类。
编辑
您可以将.scheme('https')
申请到urlBuilder
(@$urlBuilder.replaceQueryParam('id', 3).scheme('https').build().toUriString()
)。例如。您可以在控制器中创建一个方法,从负载均衡器获取X-Forwarded-Proto
。
从这里查看示例 #27:https://www.programcreek.com/java-api-examples/?api=org.springframework.web.servlet.support.ServletUriComponentsBuilder
【讨论】:
【参考方案2】:从控制器设置 baseURL,然后将 baseURL 绑定到模板
在控制器中:
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String home(ModelMap model, HttpServletRequest req)
String baseUrl = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath();
....
model.addAttribute("baseUrl", baseUrl);
model.addAttribute("name", name);
.....
在模板中:
<a th:href="@__$baseUrl__/order/details(name=$name,id=3)">
【讨论】:
当然我想保留任何现有的查询参数。随意覆盖它们。 嗯,正如最初的问题中所写:“在 URL 中保留其他参数” 抱歉我错过了以上是关于如何替换 thymeleaf 链接中的 URL 参数?的主要内容,如果未能解决你的问题,请参考以下文章