17

現在、JSF の実行順序に問題があります。

私のサンプルコードを見る:

<p:commandButton action="update.xhtml" ajax="false"
                        icon="ui-icon-pencil"
                        actionListener="#{marketingCodeBean.initForUpdate}">
    <f:setPropertyActionListener
        target="#{marketingCodeBean.marketingCode}" value="#{code}"></f:setPropertyActionListener>
</p:commandButton>

setPropertyActionListener を使用して Bean プロパティを設定し、actionListener=initForUpdate で何らかの処理を行いたいと考えています。ただし、JSF のデフォルトの実行順序は逆で、actionListener が最初に setPropertyActionListener の前に実行されます。この問題の回避策はありますか?

actionListener を用意して bean パラメータを渡すことを考えていますが、それが最善の方法かどうかはわかりません。

4

1 に答える 1

33

それは確かに予想される動作です。アクションリスナー(actionListener、、<f:actionListener>および<f:setPropertyActionListener>)はすべて、コンポーネントに登録されている順序で、actionListener最初に属性を使用して呼び出されます。メソッドを(インターフェイスの具体的な実装クラスを参照する必要があります)actionListenerとして追加する以外に、この方法で順序を変更することはできません。<f:actionListener>ActionListener

<p:commandButton ...>
    <f:setPropertyActionListener target="#{marketingCodeBean.marketingCode}" value="#{code}" />
    <f:actionListener type="com.example.InitForUpdate" />
</p:commandButton>

actionの代わりに使用することをお勧めしactionListenerます。すべてのアクションリスナーの後に呼び出されます。アクションリスナーは、アクションを「準備」することを目的としており、ビジネスアクションにそれらを使用することは実際には不適切な方法です。

<p:commandButton ... action="#{marketingCodeBean.initForUpdate}">
    <f:setPropertyActionListener target="#{marketingCodeBean.marketingCode}" value="#{code}" />
</p:commandButton>

public String initForUpdate() {
    // ...

    return "update.xhtml";
}

参照:

于 2013-01-04T15:30:14.943 に答える