カスタムタグ
JSTLのforEachでネストしたループで、外側(親)のループをループAとし、内側(子)のループをループBとする。
イメージ的には、こんな感じ↓
<c:forEach items="${dispDto.userlist}" var="row" varStatus="status"> <c:forEach var="member" items="${dispDto.memberMap}" > <c:out value="${member.key}"/> <c:out value="${member.value}"/> </c:forEach> </c:forEach>
このときに、親のループと子のループで、例えばid番号が同じだった場合に、何か特別の処理(チェックボックスをチェック状態にするなど)を行いたい。とした場合に、forEachでは、ループを抜けることができん。「break;」みたいなことが無理なんだなあと。ループを抜けるコードをjspで記述しようとすると
スクリプトレットを使用しなくてはならないようだ。
ってことで、MapインターフェイスがもつcontainsKeyやcontainsやcontainsValueなどを呼び出すことはできないだろうか? と考えて調べてみると
- ViewHelper (ビューヘルパ)を利用してみる
- S2ファミリーのcubbyにおけるカスタムタグ
とあったので、カスタムタグをcubbyから拝借させてもらって独自カスタムタグとした。
実装は、こんな感じかな
/s2struts-blank/WebContent/WEB-INF/tld/cubby-functions.tld
にカスタムタグを定義したファイルを用意し(cubbyプロダクトからコピーしてくる)、
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee"・・・・ <!-- <short-name>f</short-name> --> <short-name>fcubby</short-name> <uri>http://www.seasar.org/cubby/functions</uri> ・・・ </taglib>
もともと、prefixをfとしていたけど、cubbyと重複しないように適当な名称を定義する(今回はfcubbyとする)。
で、jsp側では、↓のような感じで行う。
<%@ taglib uri="/WEB-INF/tld/cubby-functions.tld" prefix="fcubby" %> <%-- ↑独自カスタムタグ --%> <c:forEach items="${dispDto.userlist}" var="row" varStatus="status"> <!-- 一致したら何かを行う --> <c:if test="${fcubby:containsKey(dispDto.memberMap, row)}"> <td> 一致 </td> </c:if> </c:forEach>