Тимелеар: добавьте параметр в текущий URL

Я нахожусь в

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=32 (удаляет параметр p1).

Как это сделать, используя Thymeleaf?

Ответ 1

Самое простое решение - конкатенация "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

EDIT:

Ниже приведено обходное решение, которое удаляет параметр "myparam" из URL-адреса:

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

Далее в конфигурации Spring:

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

Для более "глобального" решения я бы попытался расширить процессор для атрибута "th: href" или создать свой собственный атрибут. Я не специалист по тимелеафу, просто столкнувшись с аналогичной проблемой.

Ответ 2

Вы можете использовать URI Builder непосредственно из 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.
  • Экземпляр, созданный фабричным методом fromCurrentRequest, сохраняется в переменную urlBuilder.
  • Параметр добавляется или заменяется в строке запроса методом replaceQueryParam, а затем создается URL.

Плюсы:

  • Безопасное решение.
  • Нет завершающего ? в случае пустой строки запроса.
  • Никаких дополнительных компонентов в контексте Spring.

Минусы:

  • Это довольно многословно.

! Помните, что решение выше создает один экземпляр компоновщика. Это означает, что компоновщик нельзя использовать повторно, поскольку он все еще изменяет один 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

Ответ 3

th:href="@{/your/link?parameter=__${appendParameter}__}"

Ответ 4

Согласно документам вы можете указать все параметры

th:href="@{http://example.com/some/page(p1=11,p2=32)}"

Вы можете использовать выражения для получения значений:

th:href="@{http://example.com/some/page(p1=11,p2=${someid})}"

Ответ 5

Это будет работать для вас, даже в Юникоде:

 <ul class="pagination">
                <li th:if="${currentPage > 1}"><a th:href="'/search?key=' + ${param.key[0]} + '&amp;page=' +   ${currentPage-1}">Previous</a></li>

                      <li th:each="i : ${#numbers.sequence( 1, total+1)}" th:class="${i==currentPage}?active:''">
                            <a th:href="'/search?key=' + ${param.key[0]} + '&amp;page=' +   ${i}" th:inline="text">
                            [[${i}]] <span  class="sr-only">(current)</span>
                            </a>
                      </li>
                      <li><a th:if="${total + 1 > currentPage}" th:href="'/search?key=' + ${param.key[0]} + '&amp;page=' +   ${currentPage+1}">Next</a></li>
            </ul>