s:subsetの使い方

Struts2のTagの s:subset はリストの一部分を取り出す時に利用する。
s:incldueと組み合わせて利用すると条件によって2段組または1段組にしたい場合などで便利に使える。

リスト要素を単純に出力するとして、
s:include で取り込まれる側には純粋な1段分の出力のみを行うように次のように記述し部品化する

output_one.jsp

<%@page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<ul>
  <s:iterator value="top">
    <li>
      <s:property value="%{top}"/>
    </li>
  </s:iterator>
</ul>

そして、
layout_column はレイアウトを制御する変数で、list が出力する要素リストとした場合
メインのJSPで次のようにする

<%@page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s;if test="layout_column == '1'">
  <%-- 1段組み --%>
  <s:push value="list">
    <s:include value="output_one.jsp"/>
  </s:push>
</s:if>
<s:else>
  <%-- 2段組み --%>
  <table><tr>
    <td>
      <s:subset source="list" start="0" count="(list.size()+1)/2">
        <s:include value="output_one.jsp"/>
      </s:subset>
    </td><td>
      <s:subset source="list" start="(list.size()+1)/2">
        <s:include value="output_one.jsp"/>
      </s:subset>
    </td>
  </tr></table>
</s:else>

この例ぐらいの出力ならコピペしても問題ない内容だが、複雑な出力をする場合に出力コードが再利用できる。