2014-12-23 14 views
10

Sono alThymeleaf: aggiungere parametro url corrente

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

e voglio aggiungere un parametro URL corrente senza dover ridefinire esso:

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

con qualcosa di simile:

ma il codice sopra riportato restituisce http://example.com/some/page?&p2=32 (rimuove il parametro p1).

Come posso farlo utilizzando Thymeleaf?

+0

Non esiste ancora un modo corretto di gestirlo (a partire dalla primavera 2016)? –

risposta

10

La soluzione più semplice è concatenare "requestURI" e "queryString". Ecco esempio:

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

Risultato per "http://localhost:8080/some-page?param1=1 ":

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

Risultato per" http://localhost:8080/some-page":

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

neo:
Thymeleaf non sovrascrive i parametri - aggiunge solo parametri all'URL. Quindi, se l'utente clicca ancora una volta a questo URL, il risultato sarà:

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

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

EDIT:

Ecco alcuni workaround, che rimuove il parametro "myparam" dall'URL:

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

Avanti nella configurazione di Spring:

@Bean 
public Function<String, String> currentUrlWithoutParam() { 
    return param -> ServletUriComponentsBuilder.fromCurrentRequest().replaceQueryParam(param).toUriString(); 
} 

Per ulteriori soluzioni "globali", proverei ad estendere il processore per l'attributo "th: href" o creare il mio attributo. Non sono un esperto di Thymeleaf, sto solo affrontando un problema simile.

+0

Non c'è modo di risolvere l'inconveniente? – Andrea

+0

Soluzione alternativa per lo svantaggio consiste nel creare l'URL di base senza parametro che si desidera aggiungere. – Raf

+0

Nel primo caso: assicurati di usare '$ {# httpServletRequest.requestURI + '?' + # strings.defaultString (# httpServerRequest.queryString, '')} 'al posto, per evitare di aggiungere' null' al tuo URL. –

4

È possibile utilizzare il builder URI direttamente da Thymeleaf.

<span th:with="urlBuilder=${T(org.springframework.web.servlet.support.ServletUriComponentsBuilder).fromCurrentRequest()}" 
     th:text="${urlBuilder.replaceQueryParam('p2', '32').toUriString()}"> 
</span> 

Per URL http://example.com/some/page?p1=11 stampe fuori:

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

spiegato:

  • SPEL T operator viene utilizzato per l'accesso ServletUriComponentsBuilder tipo.
  • Un'istanza creata con il metodo di fabbrica fromCurrentRequest viene salvata nella variabile urlBuilder.
  • Un parametro viene aggiunto o sostituito nella stringa di query tramite il metodo replaceQueryParam e quindi l'URL viene creato.

Pro:

  • soluzione provvisoria.
  • Nessun trailing ? in caso di stringa di query vuota.
  • Nessun extra bean in contesto Spring.

Contro:

  • E 'abbastanza verbose.

! Tieni presente che la soluzione sopra crea un'istanza del builder. Ciò significa che il builder non può essere riutilizzato perché modifica ancora un singolo URL. Per più URL di una pagina è necessario creare più costruttori, in questo modo:

<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> 

Per http://example.com/some/page stampe:

http://example.com/some/page?p2=whatever 
http://example.com/some/page?p3=whatever  
http://example.com/some/page?p4=whatever 
0

questo lavoro per voi, anche 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>