如何替换 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

【问题讨论】:

“点击按钮”是什么意思?将请求发送到服务器?还是只是想直接更改链接中的参数? 两者。我有一个
`,因此单击 url 会更改(自动)并调用后端服务 url。
所以,应该使用 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 参数?的主要内容,如果未能解决你的问题,请参考以下文章

谷歌和雅虎如何替换浏览器状态栏中的 URL?

Thymeleaf URL 构建

用指向 URL 的链接替换文本中的 URL

Spring MVC:如何在 Thymeleaf 中获取当前 url

如何用html doc中的超链接替换纯url

thymeleaf的初次使用(带参请求以及调用带参js方法)