我正在使用 Glassfish 3.1.2.2 和 JSF Mojarra 2.1.6。
我有以下 Facelets 页面:
<h:form>
<h:commandLink value="link">
<f:actionListener binding="#{backingBean.someMethod(1)}"/>
</h:commandLink>
</h:form>
以及以下支持 bean:
@RequestScoped
@ManagedBean
public class BackingBean {
public void someMethod(int i) {
System.out.println("It was called: " + i);
}
}
当我单击该链接时,控制台中会显示“信息:已调用:1”。
的文档binding
reads:
图书馆:http://xmlns.jcp.org/jsf/core, http://java.sun.com/jsf/core(JSF核心)
标签: 动作监听器
binding
计算结果为的值绑定表达式object实现 javax.faces.event.ActionListener。 [强调我的]
另外,接受的答案这个问题指出这是不可能的f:actionListener
调用任意方法。
如果不支持,为什么要调用支持 bean 方法?
这是 EL 2.2 新功能的结果,即通过以下方式调用值表达式中的方法:#{bean.method()}
语法而不是仅通过引用属性#{bean.property}
语法(确实应该是确切的类型ActionListener
)。它在 EL 2.1 或更早版本中不起作用,并且当您删除参数和括号时它也不起作用。该文档是在 EL 2.2 还不存在时编写的(与JSF 1.2 版本从 2006 年 5 月起; EL 2.2 于 2009 年 12 月推出)。不过,我确实同意这部分需要更新,因为它会让初学者感到困惑。
您找到的答案根据文档提出了自己的观点,但回答者似乎没有意识到基于这个问题,虽然binding="#{testController.nodeListener}"
失败了,则binding="#{testController.nodeListener(event)}"
actually工作了。这只是不给你机会通过ActionEvent
。如果建议只使用,答案会更好binding="#{testController.nodeListener()}"
相反,并以其他方式获取事件信息,例如通过调用UIComponent#getCurrentComponent()甚至通过#{component}
作为论证。当然,前提是您确实需要使用它。
<h:commandLink value="link">
<f:actionListener binding="#{bean.someMethod(component)}"/>
</h:commandLink>
public void someMethod(UIComponent component) {
System.out.println("It was called on: " + component); // HtmlCommandLink
}
也可以看看:
- 在 EL 中调用直接方法或带有参数/变量/参数的方法
- JSP EL、JSF EL 和 Unified EL 之间的区别
- 动作和动作监听器之间的区别
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)