formulario java spring-mvc spring-boot thymeleaf url-parameters

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]} + ''&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>


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 acceder ServletUriComponentsBuilder tipo ServletUriComponentsBuilder .
  • Una instancia creada por el método de fábrica fromCurrentRequest se guarda en la variable urlBuilder .
  • Se agrega o reemplaza un replaceQueryParam en la cadena de consulta mediante el método replaceQueryParam y luego se replaceQueryParam 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