2011-08-18 1 views
6

Nella mia applicazione JSF2 ho un phaselistener che deve essere eseguito prima di RENDER_RESPONSE ma dopo che JSF ha creato il viewroot.Come applicare un phaselistener JSF2 dopo la creazione di viewroot?

In primo luogo, quello che ho fatto è registrare il mio PhaseListener in faces-config. L'ascoltatore viene chiamato, ma quando eseguo il beforePhase, getViewRoot().getChildren() è ancora vuoto.

In secondo luogo, ho trovato come fare questo aggiungendo quanto segue nelle mie pagine XHTML:

<f:phaseListener type="be.application.PolicyController" /> 

Questo funziona bene, ma l'aggiunta di questo per ciascuna delle mie pagine sarebbe estremamente noioso. Quindi sto cercando una possibilità di farlo una volta per la mia applicazione.

Qualche idea su come questo può essere fatto?

risposta

7

registrare un listener eventi di sistema per il PreRenderViewEvent in faces-config:

<?xml version="1.0" encoding="UTF-8"?> 

<faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" 
    version="2.0"> 

    <application> 
     <system-event-listener> 
      <system-event-listener-class>test.PreRenderViewListener</system-event-listener-class> 
      <system-event-class>javax.faces.event.PreRenderViewEvent</system-event-class> 
     </system-event-listener> 
    </application> 

</faces-config> 

Esempio di un ascoltatore:

public class PreRenderViewListener implements SystemEventListener { 

    @Override 
    public void processEvent(SystemEvent event) throws AbortProcessingException { 
     UIViewRoot root = (UIViewRoot) event.getSource(); 
     System.out.println(root.getChildCount()); 
    } 

    @Override 
    public boolean isListenerForSource(Object source) { 
     return true; 
    } 

} 
+0

ho bisogno di fare qualche azione dopo che un componente specifico viene reso/visualizzato nella pagina (o dopo che l'intera pagina viene visualizzata) il codice sopra può essere personalizzato per farlo, o sarà fatto in un modo diverso? –

0

utilizzando

<f:phaseListener type="de.xxx.listener.HeaderControlPhaseListener" /> 

in un modello (facelets) funziona bene per me O ci sono problemi di cui non sono a conoscenza ..? (Ho odiato questo faces-config.xml thingy in jsf e cerco di evitarlo completamente in jsf2)