如果 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 复合方面的验证在未呈现方面时完成

JSF2 - 为啥渲染响应不重新渲染组件设置?

JSF/Facelets:为啥将 JSF/Facelets 与 HTML 标签混合不是一个好主意?

JSF action vs actionListener [重复]

使用JSF将数据传递到引导模式

在会话作用域的JSF支持bean中观察CDI事件