Как определить имя нажатой кнопки и установить логическую переменную для оценки?

У меня есть actionListener для обнаружения нажатия кнопки команды, затем я намерен установить логическую переменную в значение true и оценить ее в другом методе, который будет выполнен; если верно, то загружаются некоторые элементы; если false, загружаются другие элементы:

Xhtml:

<h:form id="myFormID" ... >
    <p:commandButton id="myButtonID" value="Some Title" action="#{myController.pressedFilter()}" actionListener="#{myController.checkClicked}" />
...
</h:form>

Класс контроллера:

//the boolean variable:
private boolean clicked;

public boolean isClicked() {
    return clicked;
}

public void setClicked(boolean clicked) {
    this.clicked = clicked;
}

//the actionListener to detect the button clicked:
public boolean checkClicked(ActionEvent ev) {
    String buttonClickedID = ev.getComponent().getClientId();

    if (buttonClickedID.equals("myFormID:myButtonID")) {
        setClicked(true);
    }

    return clicked;
}

//the method to retrieve the items:
public Collection<T> getItems() {
    if (isClicked()) {
        items = this.ejbFacade.findSomeItems();
    } else if (!isClicked()) {
        items = this.ejbFacade.findAnotherItems();
    } 
return items;
}

//clears all datatable filters:
public String pressedFilter() {
    clearAllFilters();
    return "/app/index";
}

К сожалению, я не знаю, почему это не работает, как я ожидал.

Если я нажму на командную кнопку, для логической переменной будет установлено значение true; но при его оценке я не знаю, почему значение ложно.

Может ли кто-нибудь объяснить, что я делаю неправильно, и помочь мне исправить это, чтобы все работало так, как я описал?

Заранее спасибо.


person jMarcel    schedule 02.07.2018    source источник
comment
Какова ваша область действия бобов?   -  person R. Karlus    schedule 02.07.2018
comment
Он правильно работает с @ViewScoped.   -  person jMarcel    schedule 02.07.2018
comment
Ну, это может быть проблемой. Потому что он воссоздается каждый раз при изменении представления (обновлении браузера). Попробуйте использовать bean-компонент @SessionScoped.   -  person R. Karlus    schedule 02.07.2018
comment
@RhuanKarlus: Или @ViewAccessScoped из deltaspike: deltaspike.apache.org/documentation/jsf. html#@ViewAccessScoped   -  person Kukeltje    schedule 02.07.2018
comment
@ Руан Карлус, ты прав!! Большое спасибо!! Пожалуйста, опубликуйте это как ответ, чтобы я мог проверить, как решено.   -  person jMarcel    schedule 02.07.2018


Ответы (1)


Как упоминалось в комментариях. Проблема в том, что вы используете bean-компонент @ViewScoped, который воссоздается каждый раз при изменении представления (например, при обновлении браузера). Проверьте это: JSF Scopes.

Таким образом, изменение области действия bean-компонента на @SessionScoped может решить проблему.

person R. Karlus    schedule 02.07.2018