谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

なんか、logic:iterateのネストってうまくいかないよね。

Mapを要素に持つBeanをListにして、ActionFormに持たせてみた。


ActionForm -> List
Bean -> Map


こういう状態。


ここで、Mapを永続化させようと思って
iterateタグで二重ループを作ったんだけど、うまく行かない。

<logic:iterate id="aaa" name="aaaForm" property="aaaList">
	<html:hidden name="aaa" property="hoge" />
	<logic:iterate id="map" name="aaa" property="bbbMap">
		<html:hidden indexed="true" name="aaa" property="bbbMap(${map.key})" />
	</logic:iterate>
</logic:iterate>


出力されるHTMLは、こんな感じ。indexが期待通りにならない。

<input type="hidden" name="aaa[0].hoge" value="hoge1">
<input type="hidden" name="aaa[0].bbbMap(key1)" value="value1">
<input type="hidden" name="aaa[1].bbbMap(key2)" value="value2">
<input type="hidden" name="aaa[2].bbbMap(key3)" value="value3">

<input type="hidden" name="aaa[1].hoge" value="hoge2">
<input type="hidden" name="aaa[0].bbbMap(key4)" value="value4">
<input type="hidden" name="aaa[1].bbbMap(key5)" value="value5">
<input type="hidden" name="aaa[2].bbbMap(key6)" value="value6">

<input type="hidden" name="aaa[2].hoge" value="hoge2">
<input type="hidden" name="aaa[0].bbbMap(key7)" value="value7">
<input type="hidden" name="aaa[1].bbbMap(key8)" value="value8">
<input type="hidden" name="aaa[2].bbbMap(key9)" value="value9">

こんな風になっちゃう。


期待しているのは、

<input type="hidden" name="aaa[0].hoge" value="hoge1">
<input type="hidden" name="aaa[0].bbbMap(key1)" value="value1">
<input type="hidden" name="aaa[0].bbbMap(key2)" value="value2">
<input type="hidden" name="aaa[0].bbbMap(key3)" value="value3">

<input type="hidden" name="aaa[1].hoge" value="hoge2">
<input type="hidden" name="aaa[1].bbbMap(key4)" value="value4">
<input type="hidden" name="aaa[1].bbbMap(key5)" value="value5">
<input type="hidden" name="aaa[1].bbbMap(key6)" value="value6">

<input type="hidden" name="aaa[2].hoge" value="hoge2">
<input type="hidden" name="aaa[2].bbbMap(key7)" value="value7">
<input type="hidden" name="aaa[2].bbbMap(key8)" value="value8">
<input type="hidden" name="aaa[2].bbbMap(key9)" value="value9">

なんだけど。


子側のiterateのname属性に、親側のiterateのid属性の値を指定しているから、
keyやvalueは正しく取れてるんだけど、要素のindexがおかしくなっちゃう。


内部の実装を見てみると、hiddenタグが自分のindexを取得する際に、
「hiddenタグに一番近い親iterateタグのindex」を探しに行ってる模様。
僕が取りたいのは「hiddenタグのnameの値をidとして持つiterateタグのindex」なんだけど。


logic:iterateって、昔からハマりやすいよね。
とりあえず、logic:iterateとm:forを組み合わせることで、問題を回避しました。


Mayaa使ってない人たちがどうやって回避してるか知らないけど、
logic:iterateとc:forを組み合わせたりするのかな。