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を組み合わせたりするのかな。