jsf2 ViewScoped инициализация bean

Я новичок в технологии JSF, и я пытаюсь понять, когда и как инициализируется JSF- компонент ViewScoped.

У меня есть пример приложения с 2 бобами

ApplicationScopedBean.java

@ManagedBean
@ApplicationScoped
public class ApplicationScopedBean implements Serializable {
    private int incrementedCounter =0;

    public int getIncrementedCounter() {
        incrementedCounter += 1;
        return incrementedCounter;
    }
}

ViewScopedBean.java

@ManagedBean
@ViewScoped
public class ViewScopedBean implements Serializable {
    @ManagedProperty(value = "#{applicationScopedBean}")
    private ApplicationScopedBean applicationScopedBean;

    private int reincarnationNumber;

    private int accessCounter;

    @PostConstruct
    public void initialize() {
        accessCounter = 0;
        reincarnationNumber = applicationScopedBean.getIncrementedCounter();
        System.out.println("Initializing viewScoped stateManager with reincarnationNumber value = " + String.valueOf(reincarnationNumber));
    }

    public void noAction() {
        //do nothing
    }

    public int getReincarnationNumber() {
        return reincarnationNumber;
    }
    public int getAccessCounter() {
        accessCounter += 1;
        return accessCounter;
    }

    public ApplicationScopedBean getApplicationScopedBean() {
        return applicationScopedBean;
    }
    public void setApplicationScopedBean(ApplicationScopedBean applicationScopedBean) {
        this.applicationScopedBean = applicationScopedBean;
    }
}

Бин ApplicationScoped создается только один раз для запуска приложения. Каждый раз, когда создается объект ViewScoped, reincarnationNumber увеличивается на 1.

У меня также есть простая страница JSF для отображения этих значений:

index.xhtml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">

<h:head>
    <title>View Scoped bean test</title>
</h:head>

<h:body>
    <h:form>    
        <p>ViewScoped bean reincarnation is <h:outputText value="#{viewScopedBean.reincarnationNumber}"/></p>
        <p>ViewScoped bean access counter is <h:outputText value="#{viewScopedBean.accessCounter}"/></p>

        <h:commandButton type="submit" value="no action" action="#{viewScopedBean.noAction()}"/>
        <h:commandButton type="submit" value="reload this page" action="index"/>
    </h:form>
</h:body>

</html>

Эта проблема:

Когда я запускаю приложение в первый раз, у меня уже есть reincarnationNumber значение, равное 3.

Другими словами, эта информация отображается в браузере:

ViewScoped bean reincarnation is 3
ViewScoped bean access counter is 1

Это почему? Почему компонент ViewScoped создан 3 раза?

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

РЕШЕНИЕ

Как указано в комментариях, причиной был флажок "Запустить браузер" в разделе "Запустить конфигурации" в моей IntelliJ IDEA. Хитрость в том, что когда браузер автоматически запускается из IDE, у меня viewScopedBean инициализируется 3 раза.

1 ответ

Он не создается 3 раза, просто вызывается геттером несколько раз... и это потому, что... вы можете проверить этот ответ:

Почему JSF вызывает геттеры несколько раз

Другие вопросы по тегам