是否可以在actionListener之前调用setPropertyActionListener ?



我目前遇到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默认的执行顺序是相反的,在setPropertyActionListener之前先执行actionListener。对于这个问题是否有一个干净的解决方案?

我正在考虑有一个actionListener并传递bean参数给它,但我不确定这是否是最好的方法。

这确实是预期的行为。动作监听器(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";
}

参见:

  • action和actionListener之间的区别-解释何时使用一个或另一个。

相关内容

  • 没有找到相关文章

最新更新