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 раза, просто вызывается геттером несколько раз... и это потому, что... вы можете проверить этот ответ: