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

Tin*_*iny 7 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

会话范围的bean:

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

    public SessionScopedBean () {}

    public void action() {
        //Do something.
    }
}
Run Code Online (Sandbox Code Playgroud)

一个命令按钮,如下所示,

<h:commandButton value="Action" actionListener="#{viewScopedBean.action}"/>
Run Code Online (Sandbox Code Playgroud)

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

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

Xtr*_*ica 15

用途<f:actionListener binding>:

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

请注意EL中括号的重要性.在这个特定的例子中省略它们否则会引起混淆javax.el.PropertyNotFoundException: Property 'action' not found on type com.example.ViewScopedBean,因为它默认被解释为值表达式.添加括号使其成为方法表达式.另请参阅为什么我能够将<f:actionListener>绑定到任意方法(如果JSF不支持它)?

您甚至可以通常的方式向组件添加actionListener和/或action方法,稍后会调用.它必须是唯一的action方法,它决定处理的结果.

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

也可以看看:


归档时间:

查看次数:

11738 次

最近记录:

8 年,5 月 前