2011-08-18 12 views
6

En mi aplicación JSF2 tengo un phaselistener que debe ejecutarse antes de RENDER_RESPONSE pero después de que JSF haya construido la viewroot.¿Cómo aplicar un phaselistener JSF2 después de construir viewroot?

Primero, lo que hice fue registrar mi PhaseListener en faces-config. A continuación, se llama al oyente, pero cuando realizo beforePhase, getViewRoot().getChildren() sigue vacío.

En segundo lugar, encontré cómo hacer esto añadiendo lo siguiente en mis páginas XHTML:

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

Esto funciona bien, pero la adición de esto a cada uno de mis páginas sería muy tedioso. Por lo tanto, estoy buscando la posibilidad de hacer esto una vez para mi aplicación.

¿Alguna idea de cómo se puede hacer esto?

Respuesta

7

registrar un detector de eventos del sistema para la PreRenderViewEvent en caras-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> 

Ejemplo de un oyente:

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

necesito hacer algo de acción después de que se muestre/muestre el componente específico en la página (o después de que se muestre toda la página) ¿se puede personalizar el código anterior para hacerlo, o se hará de otra manera? –

0

usando

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

en una plantilla (facelets) funciona bien para mí ¿O hay algún problema del que no tengo conocimiento ...? (Odiaba este objeto faces-config.xml en jsf y trato de evitarlo por completo en jsf2)