パーツ状態の永続化の前に、ちょっと技術解の調査。
どうやって、動的にパーツ(HTML)を入れ替えるのか? を考える。
カスタムタグや、TagProcessor辺りのソースを読みながらも
結局は s:insertのタグをforEachで回す のが一番簡単だと気付く。
いまは出来る限り既存のモノを使いたいので、これでいこう。
で、s:insertのタグをぐるぐる回すわけだから、
<span m:inject="s:insert" m:src="#{hoge}" />
こんな風にinsertタグのm:srcに、VB式が使いたいわけで。
まずはHTML側を、こんな感じで記述。
<ul> <span m:inject="s:forEach" m:items="#{partsList}" m:var="e" m:varIndex="i"> <li> <div><span m:value="#{e}"/></div> <span m:inject="s:insert" m:src="#{e}"/> </li> </span> </ul>
forEachのタネとなるpartsListは、ひとまずdiconで定義。
<components> <component name="partsList" class="java.util.ArrayList"> <initMethod name="add"> <arg>"/parts/add.html"</arg> </initMethod> <initMethod name="add"> <arg>"/parts/forEach2List.html"</arg> </initMethod> <initMethod name="add"> <arg>"/parts/add.html"</arg> </initMethod> </component> </components>
で、org.seasar.jsf.processor.InsertProcessor#getSrcに手を加える。
最近、m:extendsでVB式が使えるようになったので、その辺りのソースを真似る。
public String getSrc() { String src = getProperty(JsfConstants.SRC_ATTR); if (BindingUtil.isValueReference(src)) { FacesContext context = FacesContext.getCurrentInstance(); Application app = context.getApplication(); ValueBinding vb = app.createValueBinding(src); return (String) vb.getValue(context); } else { return src; } }
、、、が、あれ? なんか上手く値が取得できない。
srcの値としてnullが返っちゃって、画面上ではinsertしたHTMLの中身が表示されない。
spanタグに書いた#{e}は、ちゃんとdiconで指定した文字列(パス名)に置き換わってるんだけど。
他にもBindingUtilのメソッドをいくつか試してみたけど、軒並みだめ。nullしか戻らない。
これ以上、理解しないまま試しても拉致があかないので、今日のところは中断。