【问题标题】:Checking if a button is clicked once or twice检查按钮是否被单击一次或两次
【发布时间】:2011-12-16 06:30:31
【问题描述】:

我有一个关于 jsf 生命周期和 JSP 中的 back bean 的问题:

我有一个按钮,我想控制它是否被单击一次或两次。我在后面的 bean 中有一个标志:

protected Boolean flagButtonClicked = false;

我通过以下方式控制它的行为:

public void selectAllButton_action(){    

    if(flagButtonClicked == false){
        System.out.println("flagButtonClicked == false");
        selectCB.setSelected(true);    
        setDisplayRerun(true);
        flagButtonClicked = true;
    }
    else {    
        System.out.println("flagButtonClicked == true");
        selectCB.setSelected(false);    
        setDisplayRerun(false);
        flagButtonClicked = false;
    }

}

当我点击我看到的按钮时

flagButtonClicked == false

当我再次点击它时,我又看到了

flagButtonClicked == false

所以它永远不会进入 else 状态。是否会发生这种情况,因为我在后面的 bean 中声明了受保护的 Boolean flagButtonClicked = false 并且每当它被推送时,它都会再次声明 flagButtonClicked?还是有其他解释?

编辑: 这是facelet:

<webuijsf:button actionExpression="#{user$reports.selectAllButton_action}" text="#{msg.report_select_all}"/>

Getter/Setter:

public Boolean getFlagButtonClicked() { 
  System.out.println("getFlagButtonClicked is called"); 
  return flagButtonClicked; 
} 

public void setFlagButtonClicked(Boolean flagButtonClicked) { 
  this.flagButtonClicked = flagButtonClicked; 
  System.out.println("setFlagButtonClicked is clicked"); 
}

编辑 2: 最新版本的代码是:

@ViewScoped
@ManagedBean(name="user$reports", eager=true)
public class reports extends AbstractPageBean {

受保护的布尔标志ButtonClicked = false;

public Boolean getFlagButtonClicked() {
    System.out.println("getFlagButtonClicked is called");
    return flagButtonClicked;
}

public void setFlagButtonClicked(Boolean flagButtonClicked) {
    this.flagButtonClicked = flagButtonClicked;
    System.out.println("setFlagButtonClicked is clicked" + flagButtonClicked );
}

public void selectAllButton_action(){
if(flagButtonClicked== Boolean.FALSE){
        System.out.println("flagButtonClicked == false");
        selectCB.setSelected(true);System.out.println("selectCB.setSelected(true); ");
        setDisplayRerun(true);System.out.println("setDisplayRerun(true);");
        setFlagButtonClicked(true);System.out.println(" setFlagButtonClicked(true);");
    }
    else {
        System.out.println("flagButtonClicked == true");       
        selectCB.setSelected(false);System.out.println("selectCB.setSelected(false);");
        setDisplayRerun(false);System.out.println("selectCB.setSelected(false);");
        setFlagButtonClicked(false);System.out.println("setFlagButonClicked(false)");
    }
}

输出是:

[#|2011-10-26T21:45:14.645+0300|INFO|glassfishv3.0|null|_ThreadID=29;_ThreadName=Thread-1;|flagButtonClicked == false|#]

[#|2011-10-26T21:45:14.646+0300|INFO|glassfishv3.0|null|_ThreadID=29;_ThreadName=Thread-1;|selectCB.setSelected(true); |#]

[#|2011-10-26T21:45:14.646+0300|INFO|glassfishv3.0|null|_ThreadID=29;_ThreadName=Thread-1;|setDisplayRerun(true);|#]

[#|2011-10-26T21:45:14.646+0300|INFO|glassfishv3.0|null|_ThreadID=29;_ThreadName=Thread-1;|setFlagButtonClicked is clicked true|#]

[#|2011-10-26T21:45:14.646+0300|INFO|glassfishv3.0|null|_ThreadID=29;_ThreadName=Thread-1;| setFlagButtonClicked(true);|#]
[#|2011-10-26T21:46:03.892+0300|INFO|glassfishv3.0|null|_ThreadID=31;_ThreadName=Thread-1;|flagButtonClicked == false|#]

[#|2011-10-26T21:46:03.892+0300|INFO|glassfishv3.0|null|_ThreadID=31;_ThreadName=Thread-1;|selectCB.setSelected(true); |#]

[#|2011-10-26T21:46:03.892+0300|INFO|glassfishv3.0|null|_ThreadID=31;_ThreadName=Thread-1;|setDisplayRerun(true);|#]

[#|2011-10-26T21:46:03.892+0300|INFO|glassfishv3.0|null|_ThreadID=31;_ThreadName=Thread-1;|setFlagButtonClicked is clicked true|#]

[#|2011-10-26T21:46:03.892+0300|INFO|glassfishv3.0|null|_ThreadID=31;_ThreadName=Thread-1;| setFlagButtonClicked(true);|#]

我试图检查 bean 实例:

public void init() {

        super.init();

        try {
            _init();
        } catch (Exception e) {
            log("recentreports Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e: new FacesException(e);
        }


FacesContext facesContex = FacesContext.getCurrentInstance();
        System.out.println("facesContex.getCurrentInstance();" + facesContex.getCurrentInstance().toString() );
        System.out.println("facesContex.getExternalContext().toString() " + facesContex.getExternalContext().toString());

    }

输出是:

[#|2011-10-28T11:58:03.130+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;|facesContex.getCurrentInstance();com.sun.faces.context.FacesContextImpl@19ea246|#]

[#|2011-10-28T11:58:03.130+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;|facesContex.getExternalContext().toString() com.sun.faces.context.ExternalContextImpl@1afa48b|#]

[#|2011-10-28T11:58:03.206+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;|flagButtonClicked == false|#]

[#|2011-10-28T11:58:03.206+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;|selectCB.setSelected(true); |#]

[#|2011-10-28T11:58:03.206+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;|setDisplayRerun(true);|#]

[#|2011-10-28T11:58:03.207+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;|setFlagButtonClicked is clicked true|#]

[#|2011-10-28T11:58:03.207+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;| setFlagButtonClicked(true);|#]

[#|2011-10-28T11:58:10.513+0300|WARNING|glassfishv3.0|org.apache.catalina.connector.Request|_ThreadID=32;_ThreadName=Thread-1;|PWC4011: Unable to set request character encoding to UTF-8 from context /lrms, because request parameters have already been read, or ServletRequest.getReader() has already been called|#]

[#|2011-10-28T11:58:10.533+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;|facesContex.getCurrentInstance();com.sun.faces.context.FacesContextImpl@a1b3e9|#]

[#|2011-10-28T11:58:10.533+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;|facesContex.getExternalContext().toString() com.sun.faces.context.ExternalContextImpl@2a92a1|#]

[#|2011-10-28T11:58:10.578+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;|flagButtonClicked == false|#]

[#|2011-10-28T11:58:10.579+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;|selectCB.setSelected(true); |#]

[#|2011-10-28T11:58:10.579+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;|setDisplayRerun(true);|#]

[#|2011-10-28T11:58:10.579+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;|setFlagButtonClicked is clicked true|#]

[#|2011-10-28T11:58:10.579+0300|INFO|glassfishv3.0|null|_ThreadID=32;_ThreadName=Thread-1;| setFlagButtonClicked(true);|#]

恐怕这篇文章会成为 Stackoverflow 中最长的帖子 :)

【问题讨论】:

  • 你能在你的facelet中添加调用action方法的部分吗?
  • 你的setFlagButtonClicked(..)方法被调用了吗?你用调试器验证了吗?
  • 不,它没有被调用 :( 但是 getter/settter 方法存在于 bean 声明中: public Boolean getFlagButtonClicked() { System.out.println("getFlagButtonClicked is called"); return flagButtonClicked; } public void setFlagButtonClicked(Boolean flagButtonClicked) { this.flagButtonClicked = flagButtonClicked; System.out.println("setFlagButtonClicked is clicked"); } 我不知道为什么它没有被调用..
  • setter 方法未被调用,因为您和您的应用程序从未调用它(据我从您添加的源代码中可以看出)。如果您直接修改字段,则不会调用它们(例如flagButtonClicked=true
  • 我试了和你的代码一样,结果没有错?唯一的区别是我的 bean 是 ViewScoped

标签: jsf javabeans woodstock


【解决方案1】:

我不确定,但我认为问题在于您的 bean 的范围。检查是否在第二次单击时初始化了一个新 bean,因为如果是这样,那么每次单击时,都会使用一个新变量 flagButtonClicked 初始化一个新 bean,您在创建时将其初始化为 false。

【讨论】:

  • 嗨 Khizar,首先感谢您的回答。我的 bean 是请求范围的。我尝试了 sessionscope 和应用程序范围,它们都不起作用。
猜你喜欢
  • 2020-05-23
  • 2013-03-16
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2011-05-11
  • 2016-10-12
  • 2011-01-08
  • 1970-01-01
相关资源
最近更新 更多