web-dev-qa-db-ja.com

Thymeleaf:現在のURLにパラメーターを追加

にいます

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

そして、私はそれを再定義する必要なしに現在のURLにパラメータを追加したいと思います:

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

次のようなもので:

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

しかし、上記のコードはhttp://example.com/some/page?&p2=32を返します(p1パラメータを削除します)。

Thymeleafを使用してどうすればよいですか?

17
Andrea

Thymeleafから直接URIビルダーを使用できます。

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

URL http://example.com/some/page?p1=11プリントアウト:

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

説明:

  • SpEL T operator は、ServletUriComponentsBuilderタイプへのアクセスに使用されます。
  • ファクトリメソッドfromCurrentRequestによって作成されたインスタンスは、urlBuilder変数に保存されます。
  • クエリ文字列にreplaceQueryParamメソッドによってパラメーターが追加または置換され、URLが構築されます。

長所:

  • 安全なソリューション。
  • 末尾なし?クエリ文字列が空の場合。
  • Springのコンテキストでは追加のBeanはありません。

短所:

  • かなり冗長です。

!上記のソリューションはビルダーのインスタンスを1つ作成することに注意してください。つまり、ビルダーは単一のURLを変更するため、再利用できません。ページに複数のURLがある場合は、次のように複数のビルダーを作成する必要があります。

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

ために http://example.com/some/pageプリント:

http://example.com/some/page?p2=whatever 
http://example.com/some/page?p3=whatever     
http://example.com/some/page?p4=whatever
16
Václav Kužel

最も簡単な解決策は、「requestURI」と「queryString」を連結することです。次に例を示します。

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

" http:// localhost:8080/some-page?param1 = 1 "の結果:

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

" http:// localhost:8080/some-page "の結果:

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

欠点:
Thymeleafはパラメーターを上書きせず、パラメーターをURLに追加するだけです。したがって、ユーザーがそのURLにもう一度クリックすると、結果は次のようになります。

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

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

編集:

次に、URLからパラメーター「myparam」を削除するいくつかの回避策を示します。

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

次にSpring構成:

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

より「グローバルな」ソリューションについては、属性「th:href」のプロセッサを拡張するか、独自の属性を作成してみます。私は胸腺の専門家ではなく、同様の問題に直面しています。

14
Raf
th:href="@{/your/link?parameter=__${appendParameter}__}"
1
sndu

docs に従って、allパラメータを指定できます

th:href="@{http://example.com/some/page(p1=11,p2=32)}"

式を使用して値を取得できます。

th:href="@{http://example.com/some/page(p1=11,p2=${someid})}"
1
Hans Kesting

これは、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>
0
Lay Leangsros