谷本 心 in せろ部屋

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

S2JSFでWebParts その9

パーツ状態の永続化の前に、ちょっと技術解の調査。
どうやって、動的にパーツ(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しか戻らない。
これ以上、理解しないまま試しても拉致があかないので、今日のところは中断。