Domanda

Prendi in considerazione l'esempio di hello1 basata su Web-app JSF dal tutorial ufficiale con il costruttore aggiuntivo in fagiolo gestito. La visualizzazione index.xhtml Hello.java

<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>
.

e MODIDFIDFED GENERACODICODICODETAGCODE

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;
    }
}
.

Ci sono due costruttori pubblici> / forti>. Lascia che implementiamo questa app sul server e inviato la richiesta iniziale, digitare il nome in inputText e fare clic su submit. C'è una richiesta di postback dopo submit click. Quindi, come scritto in tutroial, abbiamo la seguente sottofrase di esecuzione fase:

    .
  1. La vista dell'applicazione è costruita o ripristinata.
  2. Vengono applicati i valori dei parametri della richiesta.
  3. Conversioni e convalida vengono eseguite per i valori dei componenti.
  4. I fagioli gestiti vengono aggiornati con valori dei componenti.
  5. La logica dell'applicazione è richiamata.
  6. A quale istanza di fase del fagiolo gestito verrà creato?

    Quale costruttore verrà invocato per la creazione di questa istanza e perché? Non capisco come può essere osservato dal codice index.xhtml.

È stato utile?

Soluzione

.

in quale istanza di fase del bean gestito verrà creato?

nessuno specificamente. È costruito per la prima volta in cui un'espressione EL arbitraria ha bisogno di fare riferimento al fagiolo gestito per la prima volta mentre l'istanza del fagiolo non è presente nel suo scopo. Questo non dipende da un particolare evento di volti. Questo può essere durante la fase di visualizzazione di ripristino (la prima fase), ma questo può anche essere buono durante la fase di risposta del rendering (l'ultima fase), o qualsiasi altra fase in mezzo.

Tutto dipende da come e dove il bean è referenziato nel contesto EL tramite #{bean.xxx} nella vista (o programmaticamente nel modello). In genere non dovresti preoccuparti di questo. JSF (specificamente EL) non lo costruirà almeno prima del necessario per costruire o elaborare correttamente o rendere la vista.


.
.

Quale costruttore verrà invocato per questa creazione di istanze e perché?

Il costruttore predefinito, ovviamente. Perché la specifica dei Javabeans lo dice. Tutti gli altri costruttori non vengono mai utilizzati dalla struttura del bean gestito JSF / CDI.

Anche allora, non dovresti preoccuparti dei costruttori. È meglio eseguire l'inizializzazione in un metodo annotato di @PostConstruct invece che in un costruttore. Vale a dire, quando il bean è gestito da un quadro di gestione del fagiolo che utilizza i proxy, come il CDI, il costruttore predefinito può essere chiamato più spesso del desiderato.


.
.

non capisco come può essere osservato dal codice indice.xhtml.

Basta mettere un punto di interruzione in costruttore, @PostConstruct o qualsiasi metodo Getter / Setter pertinente ed eseguire il progetto in modalità Debug. Una volta che il punto di interruzione colpisce, esamina la pila di chiamata. Le classi e i metodi coinvolti hanno un nome generalmente piuttosto auto-documentazione. Ecco un esempio come è possibile sembrare lo stack di chiamata quando si utilizza @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 
    ...
.

Inizia in basso (ho spogliato tutte le linee dopo FacesServlet.service poiché quelle sono generalmente irrilevanti) e leggere dal basso verso l'alto. Il RenderResponsePhase.execute dice che è eseguito durante la fase di risposta del rendering. Il TextInstruction.write dice che si è verificato durante la scrittura del risultato di EL in Text Text come così <p>#{bean.something}</p>. Il resto è come la saldatura dell'implementazione CDI è trovare e istanziando il proxy e come è a sua volta istanziando il riferimento del fagiolo reale.

Se è successo durante una fase diversa, invece di RenderResponsePhase.execute ha visto ad esempio UpdateModelValuesPhase.execute e così via.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top