我正在使用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
阅读文档:
库:http : //xmlns.jcp.org/jsf/core,http : //java.sun.com/jsf/core(Jsf核心)
标签:actionListener
捆绑
值绑定表达式,其值计算为实现javax.faces.event.ActionListener的对象。[强调我的]
另外,对此问题的公认答案指出,f:actionListener
调用任意方法是不可能的。
如果不支持,为什么调用后备bean方法?
这是EL 2.2的新功能的结果,该功能通过#{bean.method()}
语法在值表达式中调用方法,而不是仅通过#{bean.property}
语法(实际上应该是确切的类型ActionListener
)引用属性。在EL 2.1或更早版本中将无法使用,并且在删除参数和括号时也将无法使用。该文档是在EL 2.2不存在时编写的(与2006年5月的JSF 1.2版本相比,实际上并没有进行修改; 2009年12月推出了EL 2.2)。但是,我确实同意它需要对该部分进行更新,因为这会使初学者感到困惑。
您找到的答案是基于文档提出的,但是答案似乎并没有基于这样的问题:虽然binding="#{testController.nodeListener}"
失败了,但binding="#{testController.nodeListener(event)}"
实际上是有效的。这只会使您没有机会通过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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句