Comment puis-je implémenter un PhaseListener
qui s'exécute à la fin du cycle de vie JSF?
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.
}
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 phasebeforePhase
- avec du code à exécuter avant le début de la phasegetPhaseId
- 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)