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:

  1. L'application est construit ou restauré.
  2. Les valeurs de paramètre de requête sont appliquées.
  3. Les Conversions et les validations sont effectuées pour les valeurs des composants.
  4. Géré haricots sont mis à jour avec les valeurs des composants.
  5. 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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top