【问题标题】:Multiple action listeners with a single command component in JSFJSF 中具有单个命令组件的多个动作侦听器
【发布时间】:2014-09-08 12:36:57
【问题描述】:

是否可以使用单个命令组件调用多个侦听器方法?例如,

视图范围的 bean:

@ManagedBean
@ViewScoped
public final class ViewScopedBean implements Serializable
{
    @ManagedProperty(value = "#{sessionScopedBean}")
    private SessionScopedBean sessionScopedBean; //Getter/Setter.
    private static final long serialVersionUID = 1L;

    public ViewScopedBean() {}

    public void action()
    {
        //Do something.
        sessionScopedBean.action();
    }
}

会话范围的 bean:

@ManagedBean
@SessionScoped
public final class SessionScopedBean implements Serializable
{
    private static final long serialVersionUID = 1L;

    public SessionScopedBean () {}

    public void action() {
        //Do something.
    }
}

如下所示的命令按钮,

<h:commandButton value="Action" actionListener="#{viewScopedBean.action}"/>

调用ViewScopedBean 中的action() 方法,然后通过注入该bean 的实例调用SessionScopedBean 中的action() 方法。

是否有可能在 XHTML 上做同样的事情,从而消除注入 bean 来调用方法的需要?

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    使用&lt;f:actionListener binding&gt;:

    <h:commandButton value="Action">
        <f:actionListener binding="#{viewScopedBean.action()}"/>
        <f:actionListener binding="#{sessionScopedBean.action()}"/>
    </h:commandButton />
    

    注意 EL 中括号的重要性。在此特定示例中省略它们会引发混乱的javax.el.PropertyNotFoundException: Property 'action' not found on type com.example.ViewScopedBean,因为默认情况下它被解释为值表达式。添加括号使其成为方法表达式。另见Why am I able to bind <f:actionListener> to an arbitrary method if it's not supported by JSF?

    您甚至可以以通常的方式将actionListener 和/或action 方法添加到组件中,稍后会调用该方法。它必须独特的是action 方法,它决定了处理的结果

    无论如何,请记住,侦听器总是在动作之前执行,并被视为“热身”。最好是在 action 方法中执行整个逻辑,即使您需要进行 bean 注入。

    另请参阅:

    【讨论】:

      猜你喜欢
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 2020-05-26
      • 2013-04-27
      相关资源
      最近更新 更多