Sie können URI-Builder direkt von Thymeleaf verwenden.
<span th:with="urlBuilder=${T(org.springframework.web.servlet.support.ServletUriComponentsBuilder).fromCurrentRequest()}"
th:text="${urlBuilder.replaceQueryParam('p2', '32').toUriString()}">
</span>
Für URL http://example.com/some/page?p1=11
druckt:
http://example.com/some/page?p1=11&p2=32
Erklärt:
- Spel
T
operator wird für den Zugriff auf ServletUriComponentsBuilder
-Typ verwendet.
- Eine durch die Factory-Methode
fromCurrentRequest
erstellte Instanz wird unter urlBuilder
Variable gespeichert.
- Ein Parameter wird in der Abfragezeichenfolge durch die Methode
replaceQueryParam
hinzugefügt oder ersetzt, und dann wird die URL erstellt.
Pro:
- sichere Lösung.
- Kein Nachlauf
?
im Falle einer leeren Abfragezeichenfolge.
- Kein zusätzlicher Bean im Spring-Kontext.
Nachteile:
- Es ist ziemlich ausführlich.
! Beachten Sie, dass die obige Lösung eine Instanz des Builders erstellt. Dies bedeutet, dass der Builder nicht wiederverwendet werden kann, da er immer noch eine einzelne URL ändert. Für mehrere URLs auf einer Seite müssen Sie mehrere Builder erstellen, wie folgt aus:
<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>
für http://example.com/some/page
druckt:
http://example.com/some/page?p2=whatever
http://example.com/some/page?p3=whatever
http://example.com/some/page?p4=whatever
Gibt es wirklich noch keinen richtigen Weg (ab Frühjahr 2016)? –