2011-01-28 5 views
4

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

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

Страница facelet:

<?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}"> 

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

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

+0

Если сеанс компонента IS сеанса ограничен, он не будет создан более одного раза за сеанс - поскольку этот beahviour широко используется, ошибка, вероятно, связана с вашим кодом, а не с JSF; вы используете @SessionScoped из нужного пакета? (в EE6 два). – fdreger

+0

fdreger-Я использую javax.faces.bean.SessionScoped. Должен ли я использовать javax.enterprise.context.SessionScoped? – TheDream34

ответ

6

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

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

@ManagedBean 
@ViewScoped 
public class Bean implements Serializable {} 
+0

Спасибо за объяснение! Оно работает. Любые предложения для хорошего места, чтобы косовать на новый JSF 2.0? Спецификации довольно тяжелые. – TheDream34

+0

Также обратите внимание на код, включающий '' и список, исходящий из компонента. Это вызовет конструктор несколько раз, даже если ViewScoped –

+0

@Chris: см. Также http://stackoverflow.com/questions/2842401/jstl-cforeach-causes-viewscoped-bean-to-invoke-postconstruct-on-every-request/ 2842424 # 2842424 – BalusC

0

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

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

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

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

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

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

Надеется, что это помогает

+0

В JSF 2 viewcope выполняет работу keepAlive или saveState –

1

Боб должен находиться в ViewScoped.

+0

Что делать, если вам не нужно сохранять данные так долго .. viewScoped работает, но не бесплатно, он потребляет память на вашем сервере, почему вам нужно хранить лишние данные так долго? Поскольку данные уже запрошены компонентом, уже будет видно, в чем смысл хранения данных в области видимости, и почему JSF должен запускать создание всех управляемых компонентов в представлении, когда нажимается commmandButton, почему бы не просто запускается компонент actionListener? –

Смежные вопросы