[Seasar-user:2661] Re: [S2JSF] 1ページで複数の初期化アクションを実行するには?
O.K.U.
oku
2005年 10月 5日 (水) 18:42:19 JST
O.K.U.です。
試しにと ValidatorChain を参考にして、以下のようなものを作成してみました。
結果、initialize() は順に起動できましたが、自動バインディングが働かなく
なってしまいました。setHogeDto() が呼ばれません。但し、dicon で property を
明示すれば呼ばれるようです。
少しスタックトレースして、いろいろ試した結果、InitActionChainImpl.initialize() で
InitAction initAction = (InitAction) container.getComponent(componentName);
String r = initAction.initialize();
の代わりに、
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication();
String methodName = "#{" + componentName + ".initialize}";
MethodBinding mb = app.createMethodBinding(methodName, null);
org.seasar.jsf.util.InvokeUtil.invoke(mb, context);
とやれば、自動バインディングもうまく働きましたが、
我ながら、どうみても(特に3行目が)反則ですよねぇ?
やはり当面、すなおに1ページ1初期化アクションとしておきます。
--- 以下、ソースの一部抜粋 ---
▼▼▼ test.html ▼▼▼
<html xmlns:m="http://www.seasar.org/maya" m:action="#{initChain.initialize}">
</html>
▼▼▼ allaction.dicon ▼▼▼
<component name="initChain" class="xxx.InitActionChainImpl" instance="request">
<initMethod name="add"><arg>"dummyInitAction"</arg></initMethod>
<initMethod name="add"><arg>"dummyInitAction2"</arg></initMethod>
</component>
<component name="dummyInitAction" class="xxx.DummyInitActionImpl" instance="request" />
<component name="dummyInitAction2" class="xxx.DummyInitAction2Impl" instance="request" />
▼▼▼ InitActionChainImpl.java ▼▼▼
public class InitActionChainImpl implements InitActionChain, InitAction, StateHolder {
List initActions = new ArrayList();
public void add(String initActionComponent) {
initActions.add(initActionComponent);
}
public String initialize() {
S2Container container = SingletonS2ContainerFactory.getContainer();
for (Iterator iterator = initActions.iterator(); iterator.hasNext(); ) {
String componentName = (String) iterator.next();
InitAction initAction = (InitAction) container.getComponent(componentName);
String r = initAction.initialize();
if (r != null) {
return r;
}
}
return null;
}
}
▼▼▼ InitAction.java ▼▼▼
public interface InitAction {
public String initialize();
}
▼▼▼ DummyInitActionImpl.java ▼▼▼
public class DummyInitActionImpl implements DummyInitAction , InitAction{
public void setHogeDto(HogeDto hoge) {
}
public String initialize() {
return null;
}
}
▼▼▼ DummyInitAction2Impl.java ▼▼▼
public class DummyInitAction2Impl implements DummyInitAction2 , InitAction{
public void setHogeDto(HogeDto hoge) {
}
public String initialize() {
return null;
}
}
Seasar-user メーリングリストの案内