daisuzz.log

【Thymeleaf】th:hrefで変数の値に応じて動的にクエリパラメータをつける方法

Thymeleafのth:hrefで変数の値に応じて動的にクエリパラメータをつける方法を備忘録として残しておきます。

やりたいこと

th:hrefでURLを生成するときに以下のように変数の値に応じて動的にクエリパラメータをつけたい。変数の値が空の場合はクエリパラメータ名も非表示にする。

  • nameの値が空でないかつ、ageの値が空のとき → /me?name=taro
  • nameの値が空かつ、ageの値が空でないとき → /me?age=20
  • nameとageの値が空でないとき → /me?name=taro&age=20

環境

  • SpringBoot 2.3.0.RELEASE
  • Thymeleaf 3.0.11.RELEASE

やりかた

変数の値をクエリパラメータに動的にセットする方法は以下のように書くことで実現できますが、

<a th:href="/me(name=${name}, age=${age})">

変数の値が空の場合、/me?name=&age=のように、生成されたURLにクエリパラメータ名が残ってしまいます。

クエリパラメータの値が空の場合にクエリパラメータ名まで非表示にするためには、thymeleafのpreprocessingという仕組みを使います。 以下のように書くことで、

<a th:href="@{/me(__(${name!=null?'name=${name}':','})__,__(${age!=null?'age=${age}':','})__)}">

変数の値が空の場合/meだけが表示されます。

__で囲まれたものは通常の式よりも早く評価されるため、th:hrefのURLの生成よりも先に${name!=null?'name=${name}':','}を評価することで、nameというクエリパラメータの値が空ではない場合のみ、name=${name}という式を返すことで、クエリパラメータ名の表示も動的に変更することができます。

サンプルプログラムは以下です。

github.com

参考資料