2011-08-18 12 views
6

W mojej aplikacji JSF2 mam fazlistener, który musi zostać wykonany przed RENDER_RESPONSE, ale po JSF zbudował viewroot.Jak zastosować fazlistę JSF2 po zbudowaniu viewroot?

Po pierwsze, zarejestrowałem mój PhaseListener w faces-config. Następnie słuchacz zostaje wywołany, ale kiedy wykonuję poprzednią fazę, getViewRoot().getChildren() jest nadal pusty.

drugie, znalazłem jak to zrobić przez dodanie następujących na moich stronach xhtml:

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

Działa to dobrze, ale dodanie tego do każdego z moich stron byłoby niezwykle uciążliwe. Dlatego szukam możliwości zrobienia tego raz dla mojej aplikacji.

Jakieś pomysły, jak to zrobić?

Odpowiedz

7

Rejestruje słuchacza zdarzenia system do PreRenderViewEvent kału-konfiguracji:

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

Przykład detektora:

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

Potrzebuję wykonać jakąś czynność po tym, jak określony komponent zostanie wyrenderowany/wyświetlony na stronie (lub po wyświetleniu całej strony) czy powyższy kod może zostać dostosowany do tego, czy zrobi to w inny sposób? –

0

pomocą

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

szablonie (Facelets) działa dobrze dla mnie. Czy są jakieś problemy, których nie jestem świadomy ...? (Nienawidzę tego things-config.xml w jsf i staram się tego całkowicie uniknąć w jsf2)

Powiązane problemy