2014-12-23 26 views
10

jestem wThymeleaf: dodać parametr do aktualnego adresu URL

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

i chcę dodać parametr aktualny adres URL bez konieczności przedefiniowania:

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

z czymś takim:

<a th:href="@{?(p2=32)}">Click here</a> 

ale powyższy kod zwraca http://example.com/some/page?&p2=32 (usuwa parametr p1).

Jak mogę to zrobić, korzystając z Thymeleaf?

+0

Czy nadal nie ma właściwego sposobu, aby sobie z tym poradzić (od wiosny 2016 r.)? –

Odpowiedz

10

Najprostszym rozwiązaniem jest łączenie "requestURI" i "queryString". Oto przykład:

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

Wynik dla "http://localhost:8080/some-page?param1=1 ":

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

Wynik dla" http://localhost:8080/some-page":

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

wadę:
Thymeleaf nie nadpisuje parametry - dodaje tylko parametry do adresu URL. Więc jeśli użytkownik kliknij ponownie do tego adresu URL, wynik będzie:

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

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

EDIT:

Oto obejście, które usuwa parametr "myparam" z adresu URL:

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

Następna konfiguracja wiosna:

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

Dalsze rozwiązania „globalny”, chciałbym spróbować rozszerzenie procesor dla atrybutu „th: href” lub tworząc własne atrybut. Nie jestem ekspertem od thymeleaf, po prostu borykającym się z podobnym problemem.

+0

Czy nie ma sposobu na rozwiązanie tego problemu? – Andrea

+0

Obejście problemu polega na utworzeniu podstawowego adresu URL bez parametru, który chcemy dodać. – Raf

+0

W pierwszym przypadku: należy użyć '$ {# httpServletRequest.requestURI + '?' + # strings.defaultString (# httpServletRequest.queryString, '')} 'zamiast tego, aby uniknąć dołączenia' null' do twojego adresu URL. –

4

Możesz użyć budowniczego URI, bezpośrednio z Thymeleaf.

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

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

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

Poradnik:

  • Spel T operator służy do uzyskiwania dostępu ServletUriComponentsBuilder typu.
  • Instancja utworzona za pomocą metody fabrycznej fromCurrentRequest zostaje zapisana w zmiennej urlBuilder.
  • Parametr zostanie dodany lub zastąpiony w ciągu zapytania za pomocą metody replaceQueryParam, a następnie zostanie utworzony adres URL.

Plusy:

  • bezpieczne rozwiązanie.
  • Bez ciągnięcia ? w przypadku pustego łańcucha zapytania.
  • Bez dodatkowych fasoli w kontekście Wiosny.

Wady:

  • Jest to dość rozwlekły.

! Należy pamiętać, że powyższe rozwiązanie tworzy jedną instancję konstruktora. Oznacza to, że program budujący nie może być ponownie użyty, ponieważ wciąż modyfikuje pojedynczy adres URL. Dla wielu adresów URL na stronie trzeba utworzyć wiele budowniczych, tak:

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

Dla http://example.com/some/page wydruki:

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

to będzie pracować dla ciebie, nawet w 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>