【问题标题】:have to press command button twice必须按命令按钮两次
【发布时间】:2012-05-30 10:56:46
【问题描述】:

我正在构建一个网页,现在注意到我必须按两次命令按钮。任何命令按钮都有同样的问题,所以我想我会在其中一个上添加动作监听器,看看我是否能看到一些东西。

<h:form id="formP">
    <p:commandButton id="temp" value="photos" actionListener="#{viewBacking.debugBreakpoint()}" action="userPhoto" />
</h:form>

backing bean 有

public void debugBreakpoint() {
    int i = 0;
    i++;
}

不幸的是,这确实有帮助。它仅在第二次按下后才达到我的断点。我怀疑某处的某个字段没有通过验证,但我想要一些方法来检测到底出了什么问题——为什么我需要第二次推送?有没有可以在 Glassfish 中打开的选项,或者可以查看调试信息转储的其他选项?我可以忽略转储,直到一切稳定,然后在我第一次按下按钮时查看到底发生了什么。

有没有这样的工具我可以使用?

【问题讨论】:

  • 将&lt;p:messages /&gt; 添加到您的页面,以便您查看任何验证错误
  • 我添加了 ,无论如何这都是个好主意。什么都没出现,但我完全不确定这是一个验证错误。更改 debugBreakpoint 的签名会导致它根本不命中它。问题是第一次没打断点,第二次是正确合法的。
  • 这个 h:form 是否被另一个 h:form 重新渲染?
  • 我正在使用带有 的主模板然后在中心 我使用 。主模板上有一个 。这会使我在中心的页面重新呈现吗?
  • 你试过其他机器和浏览器吗?我今天也遇到了这种情况,到目前为止,它是运行 Google Chrome 的 10Zig 瘦客户端本地的。无法在我的 Thinkpad 上的 IE 或 Chrome 下复制。相同的操作系统等。

标签: jsf primefaces


【解决方案1】:

当给定&lt;h:form&gt; 的父组件已被另一个带有&lt;f:ajax&gt; 的命令按钮/链接呈现/更新时,可能会发生这种情况。给定的表单将失去它的视图状态,它只有在第一次提交表单后才能恢复。任何后续提交都将按照通常的方式进行。这是由 JSF issue 790 中描述的 JSF JS API 中的错误引起的,该错误在即将发布的 JSF 2.2 中得到修复。

您需要使用&lt;f:ajax&gt; 修复另一个命令按钮/链接,以在render 中明确包含给定&lt;h:form&gt; 的客户端ID。

<f:ajax render=":somePanel :formP" />

另一种方法是将 &lt;f:ajax&gt; 替换为 PrimeFaces &lt;p:commandLink&gt; 或 &lt;p:commandButton&gt;,这样您就不需要显式包含所有表单的客户端 ID。 PrimeFaces 自己的 JS API 已包含此修复程序。

【讨论】:

  • 感谢 BalusC 的回答。我的代码中没有任何 ajax 调用。它一直让我发疯。我将打开另一个问题,在那里我获取了我的代码,打开了一个全新的项目并毫不留情地削减了所有内容。问题依然存在。请查看我将很快发布的新帖子。
  • 既然你在后面的帖子中确认是ajax问题,我就接受这个答案。我不明白 的来源。我会坚持下去,直到深入了解它。感谢您的帮助。
  • 你的具体问题毕竟是不同的,你毕竟是完全通过 ajax 导航的。另见your follow up question。我的答案更详细地阐述了here。
【解决方案2】:

在您的p:commandbutton 中添加event="onclick"
我想这会解决的。

【讨论】:

  • onclick 比 actionListener 差。当我加载页面时,它会两次命中断点(即使我没有按下按钮)。如果我查看调用堆栈,我会看到隐藏的源调用,最上面的调用是 NativeMethodAccessorImple.invoke0。然后当我真正按下按钮时,它并没有达到我的断点。啊!
  • 根据您的代码,它将查找“userPhoto”字符串结果以执行操作。这就是你想要的吗??
  • 要么尝试将 actionlistener 更改为 action。或将参数作为 (ActionEvent ev) 提供给您的 bean 方法。可能对你有帮助。
  • 是的,userPhoto 是我要导航到的页面。我选择这个按钮作为一个简单的例子。我有用于断点的 ActionListener 和用于导航的操作。问题是它在第一次和第二次都没有命中(合法地,预期的行为)。但是为什么我需要 2 次推送呢?
【解决方案3】:

或者你可以在你的 commandButton 中添加这个 ajax="false" 属性

<p:commandButton ajax="false" action="#{userController.create}" value="#{bundle.CreateUserSaveLink}"></p:commandButton>

【讨论】:

    【解决方案4】:

    我遇到了同样的问题。解决方案很简单,无需同时拥有 actionListener 和操作,只需将 actionListener 方法转换为将字符串返回到您要导航到的位置并将其用作操作的方法(并且没有 actionListener)。

    简单来说:仅使用动作(不要在提交表单的 commandButton 上使用 actionListener)。

    【讨论】:

      【解决方案5】:

      请检查您与 bean 的绑定。

      bean 字段应该是字符串或非原始的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 2017-12-03
        • 1970-01-01
        • 2012-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多