gpt4 book ai didi

jsf - JSF 中具有单个命令组件的多个操作监听器

转载 作者:行者123 更新时间:2023-12-02 03:04:21 24 4
gpt4 key购买 nike

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

View 作用域 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();
}
}

session 作用域 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() 方法,该方法又调用 SessionScopedBean 中的 action() 方法通过注入(inject)该 bean 的实例。

是否可以在 XHTML 上执行相同的操作,以便消除仅仅为了调用方法而注入(inject) Bean 的需要?

最佳答案

使用 <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 注入(inject)。

另请参阅:

关于jsf - JSF 中具有单个命令组件的多个操作监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24806943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com