要素{a、b、c、d、e、g、h、y、t}を含むstruts2クラスのリストがあります。このリストを次のような表形式で表示したい:
abc
度
ハイト
つまり、1 行あたり 3 つの要素です。「s:iterator」と「s:property」タグを使用しています。
私のアプローチは、JB の「Java 側で行う」と Jaiwo の「ビューで行う」の中間にあります。
列数を取得し、リストを分割し、列数の偶数倍でない場合は空の要素を追加し、すべてのロジックを素敵な小さなバンドルにまとめるカスタム タグをお勧めします。
ビューレイヤーのみのアプローチでは、Jaiwo のコードのいずれかのバリエーションを使用します。サブセットのアイデアについては、それらをまとまりのあるブロックに分割しますが、それでも二重反復を行います – IMO これははるかに明確です:
<s:set var="items" value="{1,2,3,4,5,6,7,8,9}" />
<s:subset var="list1" source="#items" start="0" count="3" />
<s:subset var="list2" source="#items" start="3" count="3" />
<s:subset var="list3" source="#items" start="6" count="3" />
<s:set var="nested" value="{#attr.list1, #attr.list2, #attr.list3}" />
<table>
<s:iterator value="#nested">
<tr>
<s:iterator>
<td><s:property /></td>
</s:iterator>
</tr>
</s:iterator>
</table>
リストが列数の偶数倍でない場合、これは崩壊します。(簡単に)項目をサブセットに追加することはできません(リストではなく、イテレータです)。元のリストに項目を追加するのはJSPでは扱いにくいです。
Java レイヤーのみのアプローチの問題は、ビュー レイヤーから列数を設定できるようにしたい場合 (妥当な要求)、列数を Java に取得する必要があることです。OGNL では任意のメソッドを呼び出すことができるため、最終的には、ネストされたリストを作成する小さなユーティリティを実装することになるでしょう。
<s:iterator value="@utils@slice(items, 3)">
...
しかし、(a) 見苦しく、(b) メインラインの JSP を乱雑にするため、カスタム タグでそれをまとめます。Rails のパーシャルと同様に、オブジェクトのリストの表示はリファクタリングして、次のものを残す必要があります。
<app:showItems items="..." columns="..." />
とても簡単そうです。
<table>
<tr>
<s:subset source="{1,2,3,4,5,6,7,8,9}" count="3" start="0">
<s:iterator>
<td><s:property /></td>
</s:iterator>
</s:subset>
</tr>
<tr>
<s:subset source="{1,2,3,4,5,6,7,8,9}" count="3" start="3">
<s:iterator>
<td><s:property /></td>
</s:iterator>
</s:subset>
</tr>
<tr>
<s:subset source="{1,2,3,4,5,6,7,8,9}" count="3" start="6">
<s:iterator>
<td><s:property /></td>
</s:iterator>
</s:subset>
</tr>
</table>
アップデート
を使用したくない場合subset
は、代替手段があります。
<table>
<s:iterator value="{1,2,3,4,5,6,7,8,9}" status="status">
<s:if test="%{#status.index == 0}"><tr><td><s:property /></td></s:if>
<s:elseif test="%{#status.index%3 == 0}">
</tr><tr><td><s:property /></td>
</s:elseif>
<s:else>
<td><s:property /></td>
</s:else>
</s:iterator>
</tr>
</table>