2

我有以下按钮:

   <h:commandButton 
     disabled="#{mybean.searching}"
     binding="#{mybean.searchButton}"
     actionListener="#{mybean.searchForLicenses}"
     value="Search" />

当我调试时,我看到 actionListener 先被调用了两次,然后是 3 次,然后单击了 4 次,依此类推。

似乎在每次重新加载时,actionListener 都会再注册一次。

我正在使用 Mojarra 2.1.3(也尝试过 2.0.6)和带有 IceFaces 的 Tomcat 7。

绑定是这样完成的:

private javax.faces.component.UICommand searchButton;

public void setSearchButton(UICommand searchButton) {
  this.searchButton = searchButton;
}

public UICommand getSearchButton() {
  return searchButton;
}
4

2 回答 2

8

如果您将组件绑定到会话或应用程序范围的 bean 而不是请求范围的 bean,则可能会发生这种情况。这简直是​​一个糟糕的设计。相同的组件将在多个请求/视图中重用。您需要将 bean 放在请求范围内,或者完全摆脱组件绑定。

请注意,将组件直接绑定到 bean 通常是代码中某处设计不佳的标志。它是什么,您认为这是解决方案的功能要求和/或问题?如果您对此进行详细说明,我们也许可以提出正确的方法。

另请注意,单独使用动作侦听器也是一种设计味道。我希望“searchForLicenses”是一种正常的操作方法。另请参阅action 和 actionListener 之间的差异

于 2011-11-08T14:44:37.390 回答
-1

当组件使用bindingand validatororvalueChangListener并且支持 bean 是View, SessionorApplication范围时,也会发生类似的问题。然后在请求期间多次调用相应的侦听器,但不是一次(每个新请求+1次)。

AttachedObjectListHolder一种可能的解决方案是覆盖用于存储组件的jsf 类listeners。当前的实现只是简单地listener向组件添加新组件,即使listener已经存在相同的组件。所以建议的修复是在添加之前检查它listener不存在。

您可以在此处查看修复的详细信息

于 2014-10-06T09:43:44.340 回答