Afficher l'arbre de composant JSF (UIViewRoot) Valorisé
JSF est basé sur une vue arborescente de composants dont l'état est maintenu côté serveur.
En fonction des événements, du scope des managedBean et des actions qui ont été effectuées, la valeur des composants présente dans cet arbre peut évoluer. Ce court article vous présente deux façons d’afficher cet arbre valorisé à un instant T
Debug mode de facelet
Facelet fourni un tag permettant d’afficher vie une combinaison de touche, l’arbre valorisé, ainsi que les variables et leur scope.
Il faut ajouter dans votre fichier web.xml
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>
Ensuite, il suffit de positionner le code suivant dans votre template de page, pour le rendre disponible dans toutes vos pages.
<ui:debug hotkey="d" rendered="#{initParam.debugMode}"></ui:debug>
l’attribut rendered permettra d’afficher ce composant uniquement quand facelets.DEVELOPMENT defini dans votre fichier web.xml sera positionné à true
Exemple de ce que vous pourrez obtenir en appuyant sur les touches CTRL + SHIFT + D
![]()
«agrandir»:/images/facelet-debug.png
DebugUtil, ou comment dumper dans la console l’arbre JSF valorisé
JSF fourni une classe (pas très connue) : DebugUtil, celle ci fourni des méthodes du types :
- public static String printTree(UIComponent root)
- public static void printTree(UIComponent root, Logger logger, Level level)
Avec cette classe vous pourrez donc sortir via votre console, ou vos logger le contenu de l’arbre JSF.
Ce qui vous donnera quelque chose du type :

Cette classe peut être ajoutée dans un phaseListener pour observer, dans une phase donnée (RESTORE-VIEW et RENDER_RESPONSE par exemple) l'évolution de l’arbre JSF au cours du cycle de vie.
public class ViewRootPhaseListener implements PhaseListener {
@Override
public void afterPhase(PhaseEvent phaseEvent) {
if (isDeveloppementMode()) {
//ecrit dans la console le contenu de la vue
DebugUtil.printTree(FacesContext.getCurrentInstance().getViewRoot(), System.out);
}
}
private boolean isDeveloppementMode() {
return "true".equals(FacesContext.getCurrentInstance().getExternalContext().getInitParameter(FaceletViewHandler.PARAM_DEVELOPMENT));
}
@Override
public void beforePhase(PhaseEvent arg0) {
}
@Override
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
}
En savoir +
«Docbook de facelet : debug-mode»:https://facelets.dev.java.net/nonav/docs/dev/docbook.html#template-debug