Конструктор JSF Backing Bean вызывается несколько раз - PullRequest
4 голосов
/ 28 января 2011

Я пробую JSF 2.0 (после использования ICEfaces 1.8 в течение последних нескольких месяцев) и пытаюсь понять, почему в JSF 2.0 мой конструктор компонента поддержки вызывается несколько раз.

Предполагается, что компонент создается один раз при создании, но всякий раз, когда я щелкаю по кнопке commandButton, появляется текст «Инициализированный компонент», указывающий на создание нового объекта Bean.

Страница на лицевой стороне:

    <?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">

    <h:body>
        <div id="content">
            <h:form id="form">
                <h:commandButton value="Toggle" action="#{bean.toggleShowMe}"/>
            </h:form>


            <h:panelGrid rendered="#{bean.showMe}">
                <h:outputText value="Show me!"/>
            </h:panelGrid>
        </div>
    </h:body>
</html>

Фасоль:

@ManagedBean
@RequestScoped
public class Bean {
    private boolean showMe = false;

    public boolean isShowMe() {
        return showMe;
    }

    public void setShowMe(boolean showMe) {
        this.showMe = showMe;
    }

    public void toggleShowMe(){
        System.out.println(showMe);
        if(showMe==true){
            showMe=false;
        }else{
            showMe=true;
        }
    }
    /** Creates a new instance of Bean */
    public Bean() {
        System.out.println("Bean Initialized");
    }

}

Вот и все. Просто простой тест. Такое же поведение проявляется, если я использую ICEfaces 2.0, а вместо PanelGrid я использую:

<ice:panelPopup visible="#{bean.showMe}">

Буду признателен за любую помощь здесь. Я затрудняюсь объяснить это.

Обновление : В ответ на Аба Дов, я @SessionScoped bean-компонент, полагая, что он не будет вызывать конструктор при каждом запросе, и столкнулся с тем же поведением. Что мне не хватает?

Ответы [ 4 ]

6 голосов
/ 28 января 2011

Вы объявили, что компонент помещен в область запроса, и вы каждый раз запускаете новый HTTP-запрос с помощью командной кнопки.Поистине, bean-компонент будет создаваться при каждом запросе.

Если вы хотите, чтобы bean-компонент функционировал столько же времени, сколько и само представление (как IceFaces делает это под прикрытием для всего этого AJAX), тогда вам нужно объявитьобласть видимости компонента (это новое в JSF 2.0).

@ManagedBean
@ViewScoped
public class Bean implements Serializable {}
2 голосов
/ 01 октября 2018

В моем случае проблема была в том, что я импортировал javax.faces.bean.ViewScoped вместо импорта javax.faces.view.ViewScoped.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 29 января 2011

Бин должен быть в ViewScoped.

0 голосов
/ 28 января 2011

Бин вызывается каждый раз, когда появляется запрос со страницы.

когда вы нажимаете <h:commandButton>, форма отправляется, и на сервер

отправляется запрос, чтобы предотвратить его, вы можете использовать теги <t:saveState> или <a4j:keepAlive> для своего пользователя..

например <a4j:keepAlive beanName="YourBean" />

эти теги хранят экземпляр компонента в дереве компонентов.

также убедитесь, что ваш класс implements Serializable.так что его можно сериализовать

Надеюсь, это поможет

...