【问题标题】:Primefaces commandButton calls action method on page refreshPrimefaces commandButton 在页面刷新时调用操作方法
【发布时间】:2012-10-31 11:59:19
【问题描述】:

完全编辑: 也许我混合了问题并误解了。简化我的代码后,问题简化为:如何防止<p:commandButton> 在页面刷新时执行它的操作方法(例如在浏览器窗口中按 F5 时)?

JSF 代码:

   <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui">
    <h:body>
        <h:form>
            <h:outputText value="#{bugBean.number}" />
            <h:outputText value="#{bugBean.isComplete()}" />
            <p:commandButton id="entryCommand" value="add"
                action="#{bugBean.increase()}" update="@form" oncomplete="#{bugBean.complete()}"/>
        </h:form>
    </h:body>
    </html> 

支持 bean 代码:

  package huhu.main.managebean;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;

@Named
@SessionScoped
public class BugBean implements Serializable {

   private static final long serialVersionUID = 1L;
   private int number;
   private boolean isComplete = false;

   public void increase(){
      number++;
   }

   public void complete(){
      isComplete = true;
   }

   public int getNumber() {
      return number;
   }

   public void setNumber(int number) {
      this.number = number;
   }

   public boolean isComplete() {
      return isComplete;
   }

   public void setComplete(boolean isComplete) {
      this.isComplete = isComplete;
   }
}

更新: 即使我删除了oncomplete 这样的东西并单击&lt;p:commandButton&gt; 一次,每次页面刷新时计数器都会增加。

<h:form>
        <h:outputText value="#{bugBean.number}" />
        <p:commandButton id="entryCommand" value="add"
            action="#{bugBean.increase()}" update="@form"/>
    </h:form>

【问题讨论】:

  • “页面刷新”是指在浏览器中按F5/Ctrl+R吗?
  • @BalusC 是的,我就是这个意思!
  • 在此处发布您页面的其余部分,以提供一些背景信息。
  • 我不明白你的问题。刷新页面时不会执行命令按钮,而是在按下按钮时执行。你能澄清一下吗?
  • 这就是问题所在。该方法在刷新时调用。一次又一次。

标签: ajax jsf-2 primefaces


【解决方案1】:

由于缺少头部定义,该构造缺少 Ajax 支持。在这种情况下,我只是在&lt;h:body&gt;-tag 的正上方添加了&lt;h:head/&gt;,一切正常。

感谢所有贡献者!

【讨论】:

    【解决方案2】:

    我认为不是每次页面刷新都会调用action方法increase(),而是调用complete()方法,这可能会让你认为action方法被调用了。

    p:commandButton 中的oncomplete 属性表示客户端 动作,因此是JS 方法,而不是服务器动作:EL 在每个页面上解析时执行#{bugBean.complete()}刷新。

    【讨论】:

    • 所以oncomplete 方法会在每次页面刷新时执行,无论按钮是否被点击过? action 方法呢?即使我删除了oncompleteaction 方法也会在页面刷新时执行,即使我从未点击过该按钮。
    • 是的,在您的情况下,无论是否单击按钮,都会执行 oncomplete 方法,因为它是一个 EL 表达式。不,action 方法不会在每次页面刷新时执行。请再次检查
    • Lester,oncomplete 应该在 action 方法完成时执行一些 JS 代码。它根本不应该执行 JSF 支持 bean 方法。 onXXX 属性中的任何 EL 表达式都会在页面呈现时立即进行评估,仅仅是因为它需要转换为 JS 代码。但这与您奇怪的刷新问题无关。
    • @BalusC 谢谢你的回答,我明白了。这确实很高兴知道。我真的很想知道刷新问题:考虑到我的代码,这绝对是一个奇怪的问题。谁能用我的代码重现它或有任何其他解释方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2011-04-23
    • 2016-12-07
    • 2014-01-24
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多