kuniku’s diary

はてなダイアリーから移行(旧 d.hatena.ne.jp/kuniku/)、表示がおかしな箇所はコメントをお願いします。記載されている内容は日付およびバージョンに注意してください。直近1年以上前は古い情報の可能性が高くなります。

カスタムタグ

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などを呼び出すことはできないだろうか? と考えて調べてみると

とあったので、カスタムタグを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>&nbsp;&nbsp;一致&nbsp;&nbsp;</td>
	</c:if>

</c:forEach>