【问题标题】:ActionListener is called multiple times (Bug?) - Mojarra 2.1.3ActionListener 被多次调用(错误?) - Mojarra 2.1.3
【发布时间】:2011-12-24 09:00:25
【问题描述】:

我有以下按钮:

   <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;
}

【问题讨论】:

  • 绑定是怎么做的?你能发布 get/setSearchButton 的所有相关代码吗?
  • 删除绑定后问题就消失了。 @mrembisz:我添加了绑定代码(抱歉,它没有格式化,因为我在页面上收到阻止编辑器加载的病毒警告)。
  • 当您指定绑定时,如果持有 bean 仍在范围内,您的组件将被重用。单个组件上可以有多个 actionListener,因此每个请求都会向您的命令注册一个新的侦听器。

标签: jsf icefaces mojarra


【解决方案1】:

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

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

还要注意,单独使用动作监听器也是一种设计味道。我希望“searchForLicenses”是一种正常的操作方法。另见Differences between action and actionListener

【讨论】:

  • 我猜你是对的。对我来说,不能将会话范围的 bean 与组件绑定和 actionListener 结合使用仍然不是很明显。为什么不检查侦听器是否已添加到组件中?可能我在这里的想法是错误的,但由于它完全有可能在语法方面它不应该最终陷入如此混乱......至少恕我直言。
  • Java 或 IDE 编译器无法防止“不良设计”。它最多可以防止语法或逻辑错误。
  • 完全同意,但它的工作方式(对我来说)仍然不是很明显。另外,当我使用视图范围时,我们不会陷入同样的​​混乱,因为每次重新加载时都会重新添加侦听器,因为只要用户停留在同一页面上,bean 就会被保留。看看,对吧?
  • 不,不会重新添加侦听器,因为将重新创建组件。顺便说一下,这又是由 Mojarra 的部分视图状态保存中的一个鸡蛋虫引起的。
  • 我很困惑 :) 正确的行为是重新添加侦听器,但由于 Mojarra 错误而没有这样做?
【解决方案2】:

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

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

修复的细节你可以看到here

【讨论】:

    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2010-10-24
    • 2011-10-18
    相关资源
    最近更新 更多