Тимелеар: добавьте параметр в текущий 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]} + '&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]} + '&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]} + '&page=' + ${currentPage+1}">Next</a></li>
</ul>