Проверка, нажата ли кнопка один или два раза - PullRequest
0 голосов
/ 27 октября 2011

У меня есть вопрос о жизненном цикле jsf и бинах в JSP:

У меня есть кнопка, которой я хочу управлять, если она была нажата один или два раза. У меня есть флаг на заднем бобе:

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

так что он никогда не переходит в другое состояние. Происходит ли это потому, что я объявляю защищенный Boolean flagButtonClicked = false в заднем компоненте, и при каждом его нажатии он снова объявляет flagButtonClicked? Или есть другое объяснение?

Edit: вот лицо:

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

Getter / сеттер:

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);|#]

Я пытался проверить экземпляр компонента:

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:)

1 Ответ

0 голосов
/ 27 октября 2011

Я не уверен, но я думаю, что проблема в объеме вашего боба. проверьте, если при втором щелчке инициализируется новый bean-компонент, потому что, если это происходит, то каждый раз, когда вы щелкаете, новый bean-компонент инициализируется новой переменной flagButtonClicked, которую вы инициализируете как false при создании.

...