2014-12-23 6 views
10

Ich bin beiThymeleaf: add Parameter aktuelle URL

http://example.com/some/page?p1=11 

und ich möchte einen Parameter aktuelle URL hinzuzufügen, ohne es neu zu definieren, mit:

http://example.com/some/page?p1=11&p2=32 

mit so etwas wie:

aber der obige Code gibt http://example.com/some/page?&p2=32 zurück (entfernt den Parameter p1).

Wie kann ich benutze es Thymeleaf?

+0

Gibt es wirklich noch keinen richtigen Weg (ab Frühjahr 2016)? –

Antwort

10

Die einfachste Lösung ist das Verketten von "requestURI" und "queryString". Hier ist Beispiel:

<div th:with="currentUrl=(${#httpServletRequest.requestURI + '?' + #strings.defaultString(#httpServletRequest.queryString, '')})"> 
    <a th:href="@{${currentUrl}(myparam=test)}">click here</a> 
</div> 

Ergebnis für "http://localhost:8080/some-page?param1=1 ":

http://localhost:8080/some-page?param1=1&myparam=test 

Ergebnis für" http://localhost:8080/some-page":

http://localhost:8080/some-page?&myparam=test 

Nachteil:
Thymeleaf überschreibt keine Parameter - Fügt der URL nur Parameter hinzu. Also, wenn Sie Benutzer klicken Sie erneut auf diese URL, wird das Ergebnis sein:

http://localhost:8080/some-page?param1=1&myparam=test&myparam=test 

Referenzen:
http://forum.thymeleaf.org/How-to-link-to-current-page-and-exchange-parameter-td4024870.html

EDIT:

hier etwas Abhilfe, die Parameter "MyParam" entfernt von der URL:

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

Next in Spring-Konfiguration:

Für mehr "globale" Lösung, würde ich versuchen, Prozessor für Attribut "th: href" zu erweitern oder mein eigenes Attribut zu erstellen. Ich bin kein Thymeleaf-Experte, nur mit ähnlichen Problemen konfrontiert.

+0

Gibt es keine Möglichkeit, den Nachteil zu beheben? – Andrea

+0

Problemumgehung für Nachteil ist das Erstellen einer Basis-URL ohne Parameter, den wir hinzufügen möchten. – Raf

+0

Im ersten Fall: sicher sein, '$ {# httpServletRequest.requestURI + '?' + # strings.defaultString (# httpServletRequest.queryString, '')} 'stattdessen, um das Anhängen von' null' an Ihre URL zu vermeiden. –

4

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 
0

Dies wird für Sie arbeiten, auch in 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>