Thymeleaf:将参数添加到当前网址

我在

http://example.com/some/page?p1=11

我想向当前url添加一个参数,而不必重新定义它:

http://example.com/some/page?p1=11&p2=32

与类似的东西:

<a th:href="@{?(p2=32)}">Click here</a>

但上面的代码返回(删除参数)。http://example.com/some/page?&p2=32p1

我如何使用百里香叶?


答案 1

您可以使用 URI 生成器,直接从 Thymeleaf。

<span th:with="urlBuilder=${T(org.springframework.web.servlet.support.ServletUriComponentsBuilder).fromCurrentRequest()}"
      th:text="${urlBuilder.replaceQueryParam('p2', '32').toUriString()}">
</span>

对于打印输出的 URL:http://example.com/some/page?p1=11

http://example.com/some/page?p1=11&p2=32

解释:

  • SpEL T 运算符用于访问类型。ServletUriComponentsBuilder
  • 由工厂方法创建的实例将保存到变量中。fromCurrentRequesturlBuilder
  • 通过方法在查询字符串中添加或替换参数,然后生成 URL。replaceQueryParam

优点:

  • 安全的解决方案。
  • 在查询字符串为空的情况下没有尾随。?
  • 在春季背景下没有多余的豆子。

缺点:

  • 它非常冗长。

!请注意,上面的解决方案会创建生成器的一个实例。这意味着生成器不能重复使用,因为它仍然会修改原始 URL。对于页面上的多个URL,您必须创建多个构建器,如下所示:

<span th:with="urlBuilder=${T(org.springframework.web.servlet.support.ServletUriComponentsBuilder)}">
    <span th:text="${urlBuilder.fromCurrentRequest().replaceQueryParam('p2', 'whatever').toUriString()}"></span>
    <span th:text="${urlBuilder.fromCurrentRequest().replaceQueryParam('p3', 'whatever').toUriString()}"></span>
    <span th:text="${urlBuilder.fromCurrentRequest().replaceQueryParam('p4', 'whatever').toUriString()}"></span>
</span>

对于打印:http://example.com/some/page

http://example.com/some/page?p2=whatever 
http://example.com/some/page?p3=whatever     
http://example.com/some/page?p4=whatever

答案 2

最简单的解决方案是连接“requestURI”和“queryString”。下面是一个示例:

<div th:with="currentUrl=(${#httpServletRequest.requestURI + '?' + #strings.defaultString(#httpServletRequest.queryString, '')})">
   <a th:href="@{${currentUrl}(myparam=test)}">click here</a>
</div>

http://localhost:8080/some-page?param1=1”的结果:

 http://localhost:8080/some-page?param1=1&myparam=test

http://localhost:8080/some-page”的结果:

 http://localhost:8080/some-page?&myparam=test

缺点:
Thymeleaf不会覆盖参数 - 只向URL添加参数。因此,如果您再次单击该URL,结果将是:

http://localhost:8080/some-page?param1=1&myparam=test&myparam=test

参考资料:
http://forum.thymeleaf.org/How-to-link-to-current-page-and-exchange-parameter-td4024870.html

编辑:

以下是一些解决方法,它将从URL中删除参数“myparam”:

<div th:with="currentUrl=(${@currentUrlWithoutParam.apply('myparam')})">
    <a th:href="@{${currentUrl}(myparam=test)}">click here</a>
</div>

春季配置中的下一个:

@Bean
public Function<String, String> currentUrlWithoutParam() {
    return param ->   ServletUriComponentsBuilder.fromCurrentRequest().replaceQueryParam(param).toUriString();
}

对于更“全局”的解决方案,我会尝试扩展属性“th:href”的处理器或创建自己的属性。我不是百里香专家,只是面临类似的问题。