J'essaie JSF 2.0 (après avoir utilisé ICEfaces 1.8 pour les derniers mois) et j'essaie de comprendre pourquoi dans JSF 2.0 mon constructeur de beans de backing est appelé plusieurs fois. Le bean est censé être instancié une seule fois lors de sa création, mais le texte "Bean Initialized" s'affiche chaque fois que je clique sur le bouton de commande, indiquant qu'un nouvel objet Bean est instancié.JSF Backing Bean constructeur appelé plusieurs fois
La page de 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>
La fève de support:
@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");
}
}
C'est tout ce qu'il est. Juste un test simple. Le même comportement se montre si j'utilise ICEfaces 2.0 et à la place du panelGrid J'utilise:
<ice:panelPopup visible="#{bean.showMe}">
J'apprécierais toute aide ici. Je suis incapable de l'expliquer.
Mise à jour: En réponse à Aba Dov, je @SessionScoped le bean, en supposant qu'il n'appellerait pas le constructeur à chaque requête et a rencontré le même comportement. Qu'est-ce que je rate?
Si la session IS du composant est étendue, elle ne sera pas créée plus d'une fois par session - puisque cette méthode est largement utilisée, le bogue est probablement dans votre code, pas dans JSF; utilisez-vous @SessionScoped du bon package? (il y en a deux dans EE6). – fdreger
fdreger-J'utilise javax.faces.bean.SessionScoped. Dois-je utiliser javax.enterprise.context.SessionScoped? – TheDream34