web-dev-qa-db-fra.com

Comment implémenter un PhaseListener qui s'exécute en fin de cycle de vie?

Comment puis-je implémenter un PhaseListener qui s'exécute à la fin du cycle de vie JSF?

25
Mahmoud Saleh

Vous devez implémenter l'interface PhaseListener et accrocher beforePhase() de PhaseId_RENDER_RESPONSE . La réponse de rendu est la dernière phase du cycle de vie JSF.

public class MyPhaseListener implements PhaseListener {

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
    }

    @Override
    public void beforePhase(PhaseEvent event) {
        // Do your job here which should run right before the RENDER_RESPONSE.
    }

    @Override
    public void afterPhase(PhaseEvent event) {
        // Do your job here which should run right after the RENDER_RESPONSE.
    }

}

Pour le faire fonctionner, enregistrez-le comme suit dans faces-config.xml:

<lifecycle>
    <phase-listener>com.example.MyPhaseListener</phase-listener>
</lifecycle>

Mettre à jour l'auditeur de phase ci-dessus est en effet applicable à l'ensemble de l'application. Pour avoir un écouteur de phase pour une vue spécifique, utilisez les attributs beforePhase et/ou afterPhase des <f:view> .

Par exemple.

<f:view beforePhase="#{bean.beforePhase}">
    ...
</f:view>

avec

public void beforePhase(PhaseEvent event) {
    if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
        // Do here your job which should run right before the RENDER_RESPONSE.
    }
}

Une façon plus JSF 2.0 est en passant en utilisant le <f:event type="preRenderView"> :

<f:event type="preRenderView" listener="#{bean.preRenderView}" />

avec

public void preRenderView() {
    // Do here your job which should run right before the RENDER_RESPONSE.
}
40
BalusC

Dans jsf 2 vous pouvez utiliser <f:phaseListener type="my.MyPhaseListener"> pour accrocher MyPhaseListener pour certains facelet. MyPhaseListener devrait implémenter PhaseListener et remplacer

  • afterPhase - avec du code à exécuter après la fin de la phase
  • beforePhase - avec du code à exécuter avant le début de la phase
  • getPhaseId - PhaseId enum spécifiant le nom de la phase pour laquelle l'écouteur à appeler (PhaseId.RENDER_RESPONSE comme dernière phase du cycle de vie)
5
Oleksandr Tsurika