[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 メーリングリストの案内