Pourquoi est-BackingBean méthode appelée plusieurs fois lors de la demande de facelet?
Je suis d'apprentissage et de travail sur JSF + Facelets ces jours-ci. J'ai un BackingBean et une Facelet page xHTML. Lorsque je demande à la facelet-page (une seule fois) le backing-bean-méthode est appelée plusieurs fois.
Quelle pourrait être la raison pour cela?
Je ne peux pas voir quelque chose de spécial. Merci à l'avance.
Ici est la facelet:
<?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:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
<ui:composition template="index.xhtml">
<ui:define name="content">
<h:form>Name: <h:inputText id="nameFilterPattern" value="#{kundenBackingBean.nameFilterPattern}" /><h:commandButton value="Suchen"/></h:form>
<h:dataTable var="kunde" value="#{kundenBackingBean.kunden}" rowClasses="rowHighlight, rowOrdinary">
<h:column>
<f:facet name="header">
<h:outputText value="Kundennr" />
</f:facet>
<h:outputText value="#{kunde.kundenNr}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Name" />
</f:facet>
<h:outputText value="#{kunde.name}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Vorname" />
</f:facet>
<h:outputText value="#{kunde.vorname}"/>
</h:column>
<h:column>
<h:outputLink>Details</h:outputLink>
</h:column>
</h:dataTable>
</ui:define>
</ui:composition>
</body>
</html>
Et voici le backing-bean. La méthode getKunden est appelé plusieurs fois:
@ManagedBean
@SessionScoped
public class KundenBackingBean extends AbstractBackingBean {
private String nameFilterPattern;
public List<Kunde> getKunden(){
System.out.println("getKunden");
return getApplication().getKunden(getNameFilterPattern());
}
public String getNameFilterPattern() {
return nameFilterPattern;
}
public void setNameFilterPattern(String nameFilterPattern) {
System.out.println("Name filter: " + nameFilterPattern);
this.nameFilterPattern = nameFilterPattern;
}
}
est-il toujours appelé le même nombre de fois?
utilisez-vous votre IDE mode debug pour vérifier que les méthodes appelées plusieurs fois, ou vous voyez dans les journaux?
Il semble que lors de la première demande, il est appelé 8 fois et après qu'elle est appelée à 21 reprises. J'utilise eclipse + glassfish et qu'il a commencé en mode de débogage. J'ai simplement inséré un sysout dans la méthode et compté les sorties de la console.
utilisez-vous votre IDE mode debug pour vérifier que les méthodes appelées plusieurs fois, ou vous voyez dans les journaux?
Il semble que lors de la première demande, il est appelé 8 fois et après qu'elle est appelée à 21 reprises. J'utilise eclipse + glassfish et qu'il a commencé en mode de débogage. J'ai simplement inséré un sysout dans la méthode et compté les sorties de la console.
OriginalL'auteur c0d3x | 2010-02-16
Vous devez vous connecter pour publier un commentaire.
Les accesseurs d'un haricot sont juste là pour accès modèle de données à partir de la vue de côté. Ils ont peut être appelée plusieurs fois. Habituellement, une ou deux fois, mais cela peut atteindre des centaines de fois, surtout lorsqu'également utilisé dans
UIData
composants ou à d'autres attributs quevalue
(commerendered
,disabled
, etc). Ce n'est normalement pas mal, c'est juste une simple méthode d'invocation et de faire cher le chargement des données de la logique ou des calculs est généralement pas être fait dans les getters. Le préchargement/initialisation est généralement être fait en grains de constructeur et/ou de fèves méthodes d'action. Les méthodes de lecture devrait, en fait, seulement retour les données (si nécessaire également de faire chargement paresseux).Si
getApplication().getKunden(getNameFilterPattern());
est en train de faire une assez cher, vous devriez vraiment aller à la fève de constructeur, ou des haricots@PostConstruct
méthode, ou des haricots initialisation du bloc, ou des haricots méthode d'action, ou d'introduire des chargement paresseux le modèle dans les de la lecture. Voici un exemple qui montre comment faire tout cela:Dans votre cas particulier, je pense que c'est le
@PostConstruct
(si lenameFilterPattern
est obtenu à partir d'unGET
paramètre de la requête), ou tout simplement le haricot méthode d'action (sinameFilterPattern
est obtenu à partir d'unPOST
champ de saisie) est adapté.Pour en savoir plus sur le programme JSF le cycle de vie, vous pouvez trouver ce auto-pratique de l'article utile.
Oui, c'est certainement pas la première fois que j'ai répondu comme ça 🙂 j'ai aswered au moins 20 fois avant. Pas seulement ici, mais aussi à forums.sun.com et ainsi de suite.
OriginalL'auteur BalusC
Il peut être appelé de différentes les phases de la JSF lifecylce. Mon pari serait les phases
RestoreView
et puisRenderResponse
-- je n'ai pas été en utilisant JSF ces derniers temps, donc je ne me souviens pas de cela en détail.Vous pouvez mettre en cache le dernier modèle de filtre et les clients. Vous rechargez les clients uniquement si le filtre a changé. De cette façon, vous résoudre ce problème particulier, en plus d'éviter de recharger des données si le filtre n'a pas changé.
Ou vous pouvez utiliser un
request
bean (au lieu desession
) et assurez-vous de charger les données une seule fois par demande.La réponse de BalusC que vous avez accepté recouvre tout. Je suppose que vous n'avez pas besoin de plus d'explications.
OriginalL'auteur ewernli