如何替换百万美元链接中的URL参数?

时间:2017-08-09 14:59:48

标签: java spring thymeleaf

我有一个带get参数的现有网址。单击按钮,我想更改一个特定的URL参数,但保留其他参数。这可能吗?

Thymeleaf模板:

<a th:href="@{/order/details(id=3)}">

结果:

<a href="/order/details?id=3">

如果我想

怎么办?
  • 保留网址中的其他参数
  • 覆盖id参数?

上述百里叶模板的预期结果:

localhost:8080/order/details?name=test&id=3

最好没有javascript。

2 个答案:

答案 0 :(得分:1)

尽管这是一个比较老的问题,但我希望这仍然可以:

<a th:href="@{${urlBuilder.replaceQueryParam('id', 3).build().toUriString()}}" th:with="urlBuilder=${T(org.springframework.web.servlet.support.ServletUriComponentsBuilder).fromCurrentRequest()}">

这将构建完整的URI字符串,包括HTTP(S)部分。因此,如果您为网络应用程序使用(例如)负载平衡器,并且它不直接转发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

答案 1 :(得分:0)

从控制器设置baseURL,然后将baseURL绑定到模板

在控制器中:

{
    "id": 1,
    "title": "Algebra",
    "description": "Do you know your y times table?",
    "subject_id": 1,
    "lessons": [
        {
            "id": 1,
            "title": "Functions",
            "description": "A mapping of inputs to outputs",
            "position": 2,
            "course_id": 1,
            "activities": [
                {
                   "id": 1,
                   "title": "Activity 1"
                   "task": 
                       {
                           "id": 1,
                           "name": "Task name here"
                       }
               }
            ]
        }
    ]
}

在模板中:

@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);
  .....