JSF中具有单个命令组件的多个动作侦听器

时间:2014-07-17 14:55:25

标签: jsf jsf-2

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

视图范围的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}"/>

调用action()中的方法ViewScopedBeanaction()通过注入该bean的实例来调用SessionScopedBean中的{{1}}方法。

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

1 个答案:

答案 0 :(得分:12)

使用<f:actionListener binding>

<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方法,它决定处理的结果

无论如何,请记住,听众总是在行动之前被执行,并被认为是“热身”。你最好的是在动作方法中执行整个逻辑,即使你需要进行bean注射。

另见: