如果 JSF 不支持,为啥我可以将 <f:actionListener> 绑定到任意方法?
Posted
技术标签:
【中文标题】如果 JSF 不支持,为啥我可以将 <f:actionListener> 绑定到任意方法?【英文标题】:Why am I able to bind <f:actionListener> to an arbitrary method if it's not supported by JSF?如果 JSF 不支持,为什么我可以将 <f:actionListener> 绑定到任意方法? 【发布时间】:2015-08-25 00:47:28 【问题描述】:我正在使用 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>
还有下面的backing-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 的 object。 [强调我的]
此外,this question 的公认答案指出,f:actionListener
不可能调用任意方法。
如果不支持,为什么要调用支持 bean 方法?
【问题讨论】:
【参考方案1】:这是 EL 2.2 新特性的结果,即通过 #bean.method()
语法调用值表达式中的方法,而不是仅通过 #bean.property
语法引用属性(这确实应该是 @987654328 的确切类型@)。它在 EL 2.1 或更早版本中不起作用,并且当您删除参数和括号时它也不起作用。该文档是在 EL 2.2 不存在时编写的(与 2006 年 5 月的 JSF 1.2 version 相比,它实际上没有修改;EL 2.2 于 2009 年 12 月推出)。不过,我同意它需要更新这部分内容,因为这会让初学者感到困惑。
您找到的答案基于文档提出了观点,但回答者似乎并没有意识到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
另见:
Invoke direct methods or methods with arguments / variables / parameters in EL Difference between JSP EL, JSF EL and Unified EL Differences between action and actionListener【讨论】:
以上是关于如果 JSF 不支持,为啥我可以将 <f:actionListener> 绑定到任意方法?的主要内容,如果未能解决你的问题,请参考以下文章
JSF/Facelets:为啥将 JSF/Facelets 与 HTML 标签混合不是一个好主意?