JSF Backing Bean constructeur appelé plusieurs fois
Je vais essayer de JSF 2.0 (après l'utilisation de ICEfaces 1.8 depuis quelques mois) et je suis à essayer de comprendre pourquoi en JSF 2.0 mon backing bean constructeur est appelé à de multiples reprises.
Le haricot est censé être instancié à la fois lors de la création, mais le "Haricot Initialisé" texte s'affiche à chaque fois que je clique sur le bouton de commande, indiquant une nouvelle Bean objet instansiated.
La facelet page:
<?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>
Le backing bean:
@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. Qu'un simple test. Le même comportement se montre si j'utilise ICEfaces 2.0 et à la place de la panelGrid j'utilise:
<ice:panelPopup visible="#{bean.showMe}">
Je vous remercie de toute l'aide ici. Je suis à une perte pour l'expliquer.
Mise à jour: En réponse à l'Aba Dov, I @SessionScoped le haricot, pensant qu'il ne serait pas appeler le constructeur lors de chaque demande et a couru dans le même comportement. Ce qui me manque?
fdreger-je suis en utilisant javax.des visages.haricot.SessionScoped. Dois-je utiliser javax.de l'entreprise.contexte.SessionScoped?
OriginalL'auteur TheDream34 | 2011-01-28
Vous devez vous connecter pour publier un commentaire.
Vous avez déclaré que la fève à être placé dans le champ d'application request et vous de tirer une nouvelle requête HTTP à chaque fois par le bouton de commande. Vraiment le bean sera créé sur chaque demande.
Si vous voulez que le haricot vit aussi longtemps que la vue elle-même (comme IceFaces est en train de faire sous les couvertures pour tout ce que ajax trucs), alors vous devez déclarer le bean vue étendue (ce qui est nouveau dans la JSF 2.0).
Surveillez également le code impliquant
<c:forEach ...>
et une liste à venir à partir d'un bean. Ce qui appelle le constructeur de multiples fois, même quand ViewScopedvoir aussi stackoverflow.com/questions/2842401/...
J'aurais du lire ce post, plus en détail, trouvé cela à la dure. J'ai des problèmes avec imbriqué ui:repeat (stackoverflow.com/questions/3708490/...). J'ai vraiment envie de voir JSF 2.2 sortir de résoudre de tels problèmes.
la gestion de l'état de
<ui:repeat>
est sévèrement dans Mojarra. Utilisation MyFaces ou une 3ème partie de la bibliothèque de composants de l'offrir dansUIData
saveur (par exemple<t:dataList>
).OriginalL'auteur BalusC
Dans mon cas, le problème a été j'ai importé "javax.des visages.haricot.ViewScoped" au lieu de l'importation "javax.des visages.vue.ViewScoped".
Espère qu'elle pourra aider quelqu'un.
OriginalL'auteur Clément Bareth
Le haricot est appelée à chaque fois qu'il y a une demande de la page.
lorsque vous cliquez sur le
<h:commandButton>
le formulaire est soumis et qu'une demande est envoyée au serveurafin de prévenir, vous pouvez utiliser
<t:saveState>
ou<a4j:keepAlive>
les balises de votre été.par exemple
<a4j:keepAlive beanName="YourBean" />
ces balises magasins de la fève exemple, dans le volet d'arborescence .
assurez-vous également que votre classe
implements Serializable
. de sorte qu'il peut être sérialiséEspère que cette aide
OriginalL'auteur Aba Dov
Le bean doit être dans le ViewScoped.
OriginalL'auteur Krishna