如果 JSF 不支持,为什么我能够将 绑定到任意方法?

2023-12-09

我正在使用 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(使用前将#替换为@)

如果 JSF 不支持,为什么我能够将 绑定到任意方法? 的相关文章

随机推荐