Thymeleafのth:hrefで変数の値に応じて動的にクエリパラメータをつける方法を忘備録として残しておきます。
やりたいこと
th:hrefでURLを生成するときに以下のように変数の値に応じて動的にクエリパラメータをつけたい。変数の値が空の場合はクエリパラメータ名も非表示にする。
- nameの値が空でないとき →
/me?name=taro
- 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}
という式を返すことで、クエリパラメータ名の表示も動的に変更することができます。
サンプルプログラムは以下です。