是否可以使用单个命令组件调用多个侦听器方法?例如,
视图范围的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()
中的方法ViewScopedBean
,action()
通过注入该bean的实例来调用SessionScopedBean
中的{{1}}方法。
是否有可能在XHTML上做同样的事情,以便可以消除只是为了调用方法而注入bean的需要?
答案 0 :(得分:12)
<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注射。
另见: