À quelle phase est managed bean construit et quel constructeur est utilisé
-
21-12-2019 - |
Question
Considérons l'exemple de l'ACI en fonction de l'application web hello1
de tutoriel officiel avec plus de constructeur dans managed bean.La suite index.xhtml
facelet
<html lang="en"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
<title>Facelets Hello Greeting</title>
</h:head>
<h:body>
<h:form>
<h:graphicImage url="#{resource['images:duke.waving.gif']}"
alt="Duke waving his hand"/>
<h2>Hello hui, my name is Duke. What's yours?</h2>
<h:inputText id="username"
title="My name is: "
value="#{hello.name}"
required="true"
requiredMessage="Error: A name is required."
maxlength="25" />
<p></p>
<h:commandButton id="submit" value="Submit" action="response">
</h:commandButton>
<h:commandButton id="reset" value="Reset" type="reset">
</h:commandButton>
</h:form>
<div class="messagecolor">
<h:messages showSummary="true"
showDetail="false"
errorStyle="color: #d20005"
infoStyle="color: blue"/>
</div>
</h:body>
</html>
et modidfied managed bean Hello.java
package javaeetutorial.hello1;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@Named
@RequestScoped
public class Hello {
private String name;
public Hello() {
}
public Hello(String name){
this.name=name;
}
public String getName() {
return name;
}
public void setName(String user_name) {
this.name = user_name;
}
}
Il y a deux les constructeurs publics.Laissez-nous déployer cette application sur le serveur et envoyés demande initiale, tapez le nom dans inputText
et cliquez sur submit
.Il y a demande de publication après submit
cliquez sur.Donc, comme écrit dans tutroial, nous avons sous-phase d'exécution de la phase:
- L'application est construit ou restauré.
- Les valeurs de paramètre de requête sont appliquées.
- Les Conversions et les validations sont effectuées pour les valeurs des composants.
- Géré haricots sont mis à jour avec les valeurs des composants.
- La logique de l'Application est invoquée.
À quelle phase de l'instance de bean géré seront créés?
Ce constructeur sera invoquée pour cette création de l'instance et pourquoi?Je ne comprends pas comment on peut l'observer à partir de la index.xhtml
code.
La solution
À quelle phase de l'instance de bean géré seront créés?
Pas un en particulier.Il est construit pour la première fois lors de l'arbitraire expression EL doit faire référence au bean géré pour la première fois lors de la fève instance n'est pas présent dans son champ d'application.Ce n'est pas dépendante sur certains visages de l'événement.Cela peut être lors de la restauration de la vue de phase (la première phase), mais cela peut être aussi bien pendant le rendu de la réponse de phase (la dernière phase), ou toute autre phase entre les deux.
Tout cela dépend de comment et où le bean est référencé dans EL contexte via #{bean.xxx}
dans la vue (ou par programmation dans le modèle).Vous devriez vous inquiétez pas à ce sujet.JSF (spécifiquement EL) permettra au moins de ne pas construire plus tôt que nécessaire afin de construire ou de processus ou de rendre la vue.
Ce constructeur sera invoquée pour cette création de l'instance et pourquoi?
Le constructeur par défaut, bien sûr.Parce que la spécification Ejb dit.Tous les autres constructeurs ne sont jamais utilisés par JSF/CDI managed bean installation.
Même alors, vous ne devriez pas vous inquiéter pour les constructeurs.Vous feriez mieux de procéder à l'initialisation dans un @PostConstruct
méthode annotée au lieu de dans un constructeur.À savoir, lorsque le bean est géré par un haricot cadre de gestion qui utilise des proxy, comme le CDI, le constructeur par défaut peut être appelé plus souvent que souhaité.
Je ne comprends pas comment on peut l'observer à partir de l'index.code xhtml.
Il suffit de mettre un point d'arrêt dans le constructeur, @PostConstruct
, ou que ce soit pertinent de lecture/définition de la méthode et exécuter le projet en mode debug.Une fois que le point d'arrêt est atteint, examiner la pile d'appel.Les classes et les méthodes ont généralement plutôt l'auto-documentation des noms.Voici un exemple de la façon dont la pile d'appel peut regarder comme lorsque vous êtes à l'aide de @Named
:
Daemon Thread [http-bio-8088-exec-6] (Suspended (entry into method <init> in TestBean))
owns: LocalCache$StrongEntry (id=503)
owns: SocketWrapper (id=504)
TestBean$Proxy$_$$_WeldClientProxy.<init>() line: not available [local variables unavailable]
NativeConstructorAccessorImpl.newInstance0(Constructor, Object[]) line: not available [native method]
NativeConstructorAccessorImpl.newInstance(Object[]) line: 57
DelegatingConstructorAccessorImpl.newInstance(Object[]) line: 45
Constructor.newInstance(Object...) line: 526
Class.newInstance() line: 374
NewInstanceAction.run() line: 33
AccessController.doPrivileged(PrivilegedExceptionAction<T>) line: not available [native method]
ClientProxyFactory(ProxyFactory).create(BeanInstance) line: 271
ClientProxyFactory.create(BeanInstance) line: 111
ClientProxyProvider.createClientProxy(Bean<T>, Set<Type>) line: 181
ClientProxyProvider.createClientProxy(Bean<T>) line: 171
ClientProxyProvider.access$100(ClientProxyProvider, Bean) line: 45
ClientProxyProvider$CreateClientProxy.load(Bean<Object>) line: 56
ClientProxyProvider$CreateClientProxy.load(Object) line: 52
LocalCache$LoadingValueReference.loadFuture(K, CacheLoader<? super K,V>) line: 3589
LocalCache$Segment.loadSync(K, int, LoadingValueReference<K,V>, CacheLoader<? super K,V>) line: 2374
LocalCache$Segment.lockedGetOrLoad(K, int, CacheLoader<? super K,V>) line: 2337
LocalCache$Segment.get(K, int, CacheLoader<? super K,V>) line: 2252
LocalCache.get(K, CacheLoader<? super K,V>) line: 3990
LocalCache.getOrLoad(K) line: 3994
LocalCache$LocalLoadingCache.get(K) line: 4878
LoadingCacheUtils.getCacheValue(LoadingCache<K,V>, K) line: 52
LoadingCacheUtils.getCastCacheValue(LoadingCache<K,V>, Object) line: 80
ClientProxyProvider.getClientProxy(Bean<T>) line: 187
WeldELResolver(AbstractWeldELResolver).lookup(BeanManagerImpl, ELContext, String) line: 110
WeldELResolver(AbstractWeldELResolver).getValue(ELContext, Object, Object) line: 91
WeldApplication$LazyBeanManagerIntegrationELResolver(ForwardingELResolver).getValue(ELContext, Object, Object) line: 49
CompositeELResolver.getValue(ELContext, Object, Object) line: 67
DemuxCompositeELResolver._getValue(int, ELResolver[], ELContext, Object, Object) line: 176
DemuxCompositeELResolver.getValue(ELContext, Object, Object) line: 203
AstIdentifier.getValue(EvaluationContext) line: 72
ValueExpressionImpl.getValue(ELContext) line: 185
WeldValueExpression.getValue(ELContext) line: 50
ELText$ELTextVariable.writeText(ResponseWriter, ELContext) line: 227
ELText$ELTextComposite.writeText(ResponseWriter, ELContext) line: 150
TextInstruction.write(FacesContext) line: 85
UIInstructions.encodeBegin(FacesContext) line: 82
UIInstructions(UILeaf).encodeAll(FacesContext) line: 207
HtmlBody(UIComponent).encodeAll(FacesContext) line: 1899
UIViewRoot(UIComponent).encodeAll(FacesContext) line: 1899
FaceletViewHandlingStrategy.renderView(FacesContext, UIViewRoot) line: 451
MultiViewHandler.renderView(FacesContext, UIViewRoot) line: 131
ConversationAwareViewHandler(ViewHandlerWrapper).renderView(FacesContext, UIViewRoot) line: 337
RenderResponsePhase.execute(FacesContext) line: 120
RenderResponsePhase(Phase).doPhase(FacesContext, Lifecycle, ListIterator<PhaseListener>) line: 101
LifecycleImpl.render(FacesContext) line: 219
FacesServlet.service(ServletRequest, ServletResponse) line: 647
...
Commencer par le bas (je l'ai dépouillé de toutes les lignes après FacesServlet.service
que ceux qui sont généralement hors de propos) et à lire de bas en haut.L' RenderResponsePhase.execute
dit qu'il est exécuté pendant le rendu de la réponse de phase.L' TextInstruction.write
raconte qu'elle s'est produite lors de l'écriture du résultat de EL dans le modèle de texte comme <p>#{bean.something}</p>
.Le reste est juste la façon dont le CDI de mise en œuvre de Soudure est de trouver et de l'instanciation de la procuration et de la façon dont il est à son tour de l'instanciation de la réelle haricot de référence.
Si c'est arrivé lors d'une phase différente, vous feriez à la place de RenderResponsePhase.execute
l'avons vu par exemple UpdateModelValuesPhase.execute
et ainsi de suite.