JavaのテンプレートエンジンであるThymeleafにおいて、リストのデータを順番に表示する繰り返し処理は頻繁に使用されます。その際、現在のデータが何番目であるかを示す添字(インデックス)や、データの総数といった付随情報が必要になることがあります。Thymeleafでは、ステータス変数という仕組みを用いることで、これらの情報を簡単に取得できます。
ステータス変数の定義と基本構造
繰り返し処理を行うth:each属性では、通常、取り出した要素を格納する変数を定義します。この変数の後ろにカンマを添えて別の名前を記述することで、ループの状態を管理するステータス変数を定義することが可能です。
このステータス変数は、マラソン大会で走者の通過順位や残り人数を記録している記録員のノートに例えることができます。走者(データ)そのものとは別に、その走者が何番目に通過したかという順序を正確に記録している状態です。
<table border="1">
<tr>
<th>番号</th>
<th>名前</th>
<th>都市</th>
</tr>
<tr th:each="user, stat : ${users}">
<td th:text="${stat.count}">1</td>
<td th:text="${user.name}">名前</td>
<td th:text="${user.address?.city}">都市名</td>
</tr>
</table>
ステータス変数から取得できる主要な情報
ステータス変数を用いると、以下のような情報を取得して画面制御に利用できます。
- index:0から始まる現在の番号(0, 1, 2...)
- count:1から始まる現在の番号(1, 2, 3...)
- size:リストに含まれる全要素の数
- first:現在の要素がリストの先頭であるかどうか(真偽値)
- last:現在の要素がリストの最後であるかどうか(真偽値)
- even:現在の番号が偶数回目かどうか(1始まりのcount基準)
- odd:現在の番号が奇数回目かどうか
ステータス変数を活用するメリットとデメリット
データの階層構造やリスト表示において、ステータス変数を利用することによる事実としての利点と欠点は以下の通りです。
メリット
- 表示の柔軟性が向上する:表の行に連番を振ったり、特定の行にだけ特別なデザインを適用したりすることが容易になります。
- プログラムの分離が保てる:Java側のロジックで番号を計算してデータに持たせる必要がなく、HTML側だけで表示上の制御が完結します。
- 視認性の確保:奇数行と偶数行で背景色を変えるといった「ストライプテーブル」の実装が非常に簡潔に行えます。
デメリット
- 記述量の増加:th:each属性の中に複数の変数を記述するため、記述漏れやスペルミスが発生する可能性が高まります。
- テンプレートの複雑化:ステータス変数を用いた条件分岐を多用しすぎると、HTMLファイルの構造が複雑になり、メンテナンスの負担が増える傾向にあります。
まとめ
Thymeleafのth:eachでステータス変数を使いこなすことで、ユーザーにとって見やすいリスト表示が可能になります。学習を深めるためのステップとして、以下の順序で取り組んでみてください。
- まずはステータス変数を使わずに、th:eachで単純なデータの繰り返し表示ができるか確認する。
- ステータス変数を定義し、count属性を用いて表の中に1からの連番を表示させる。
- stat.firstやstat.lastをth:if属性と組み合わせ、最初や最後のデータにだけ特定のメッセージを表示させる処理を試行する。
- stat.evenやstat.oddを用いて、行ごとに異なるCSSクラスを適用し、デザインの制御を行う。