java - formulario - Thymeleaf: agrega el parámetro a la URL actual
thymeleaf java spring (3)
estoy en
http://example.com/some/page?p1=11
y quiero agregar un parámetro a la URL actual sin tener que redefinirlo:
http://example.com/some/page?p1=11&p2=32
con algo como:
<a th:href="@{?(p2=32)}">Click here</a>
pero el código anterior devuelve http://example.com/some/page?&p2=32
(elimina el parámetro p1
).
¿Cómo puedo hacerlo usando Thymeleaf ?
Esto funcionará para usted, incluso en Unicode:
<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>
La solución más fácil es concatenar "requestURI" y "queryString". Aquí hay un ejemplo:
<div th:with="currentUrl=(${#httpServletRequest.requestURI + ''?'' + #strings.defaultString(#httpServletRequest.queryString, '''')})">
<a th:href="@{${currentUrl}(myparam=test)}">click here</a>
</div>
Resultado para " http: // localhost: 8080 / some-page? Param1 = 1 ":
http://localhost:8080/some-page?param1=1&myparam=test
Resultado para " http: // localhost: 8080 / some-page ":
http://localhost:8080/some-page?&myparam=test
Retirarse:
Thymeleaf no sobrescribe parámetros, solo agrega parámetros a la URL. Entonces, si el usuario vuelve a hacer clic en esa URL, el resultado será:
http://localhost:8080/some-page?param1=1&myparam=test&myparam=test
Referencias
http://forum.thymeleaf.org/How-to-link-to-current-page-and-exchange-parameter-td4024870.html
EDITAR:
Aquí hay una solución, que elimina el parámetro "myparam" de la URL:
<div th:with="currentUrl=(${@currentUrlWithoutParam.apply(''myparam'')})">
<a th:href="@{${currentUrl}(myparam=test)}">click here</a>
</div>
Siguiente en la configuración de Spring:
@Bean
public Function<String, String> currentUrlWithoutParam() {
return param -> ServletUriComponentsBuilder.fromCurrentRequest().replaceQueryParam(param).toUriString();
}
Para una solución más "global", trataría de extender el procesador para el atributo "th: href" o crear mi propio atributo. No soy un experto en hoja de tomillo, solo estoy enfrentando un problema similar.
Puede usar el creador de URI, directamente desde Thymeleaf.
<span th:with="urlBuilder=${T(org.springframework.web.servlet.support.ServletUriComponentsBuilder).fromCurrentRequest()}"
th:text="${urlBuilder.replaceQueryParam(''p2'', ''32'').toUriString()}">
</span>
Para la URL http://example.com/some/page?p1=11
imprime:
http://example.com/some/page?p1=11&p2=32
Explicado:
- El operador SpEL
T
se utiliza para accederServletUriComponentsBuilder
tipoServletUriComponentsBuilder
. - Una instancia creada por el método de fábrica
fromCurrentRequest
se guarda en la variableurlBuilder
. - Se agrega o reemplaza un
replaceQueryParam
en la cadena de consulta mediante el métodoreplaceQueryParam
y luego sereplaceQueryParam
la URL.
Pros:
- Solución segura
- Sin seguimiento
?
en caso de cadena de consulta vacía. - Sin frijoles adicionales en el contexto de primavera.
Contras:
- Es bastante detallado.
! Tenga en cuenta que la solución anterior crea una instancia del generador. Esto significa que el constructor no puede reutilizarse porque aún modifica una sola URL. Para varias URL en una página, debe crear varios constructores, como este:
<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>
Para http://example.com/some/page
prints:
http://example.com/some/page?p2=whatever
http://example.com/some/page?p3=whatever
http://example.com/some/page?p4=whatever