4

我正在使用 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 方法?

4

1 回答 1

6

这是新的 EL 2.2 特性的结果,即通过语法调用值表达式中的方法,#{bean.method()}而不是仅通过语法引用属性#{bean.property}(它确实应该是确切的类型ActionListener)。它在 EL 2.1 或更早版本中不起作用,并且当您删除参数和括号时它也不起作用。该文档是在 EL 2.2 不存在时编写的(与2006 年 5 月的JSF 1.2 版本相比,它实际上没有修改;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
}

也可以看看:

于 2015-06-10T07:31:42.553 回答