Utiliser les Constantes Java dans les .JSP

Il arrive de voir dans le code des fichiers JSP d’une application Web Java, des tests de la forme :

<c:if test='${monForm.userProfil == 99 }'>
    <p>Salut Admin </p>
</c:if>

A mes yeux, ce genre de tests posent des problèmes de lecture du code, et a fortiori de maintenance. De plus, si on reprend l’exemple ci-dessus, le nombre 99 fait la plupart du temps référence à une constante de l’application. On a l’habitude de déclarer toutes ces constantes dans une classe statique, et on peut ainsi y accéder partout dans le code JAVA. Pourquoi ne pas faire de même dans les fichiers JSP ?


Un technique est d’utiliser l’API java.lang.reflect afin de stocker tous les attributs statiques de la classe contenant les constantes dans un tableau. Le bout de code suivant est un exemple d’une classe de constantes que l’on trouve généralement dans une appli JAVA :

/*
 *Ma classe Constantes qui contient toutes les constantes utilisés dans l'appli
 *
 * @author arnaud
 */
public final class Constantes {

    //Id profil admin
    public static final Integer PROFIL_ADMIN = 99;

}

Pour pouvoir utiliser ces constantes (ici PROFIL_ADMIN) on doit ajouter un tableau (ou plus précisément une Map) contenant les attributs et leurs valeurs.
Un exemple de code à ajouter à la classe :

    //Id de la classe, utilisé comme clé dans les JSP
    public static final String IdClass = "Constantes";    

    //Tableau qui contiendra les constantes
    private static final Map mapOfStaticFields = createMapOfStaticFields();

    //Getteur de mapOfStaticFields
    public static Map getMapOfStaticFields() {
        return mapOfStaticFields;
    }

    /**
    * Function qui charge les attributs static de la classe
    * dans mapOfStaticFields
    * @return Map
    */
    private static Map createMapOfStaticFields()
    Map staticFields = new HashMap();
    Field[] listOfStaticFields = Constantes.class.getFields();
    for (int i = 0; i < listOfStaticFields.length; i++) {
        Field field = listOfStaticFields[i];
        String name = field.getName();
        try {
            staticFields.put(name, field.get(null));
        } catch (Exception e) {
            System.err.println("Initialisation de la map des constantes échouée !");
            e.printStackTrace(System.err);
        }
    }
    return staticFields;
    }

Grâce à ça, on peut accéder à la liste des constantes dans le code JAVA. Il ne reste plus qu’à charger le tableau des constantes dans un listener qu’on chargera au démarrage de l’application. Tout d’abord il faut créer un listener.
Exemple :

/**
 * Web application lifecycle listener.
 * @author arnaud
 */
public class StrutsTestAppListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        ServletContext sc = sce.getServletContext();
        sc.setAttribute(Constantes.IdClass, Constantes.getMapOfStaticFields());
        System.out.println("Map des constantes chargée avec succès !");
    }

    public void contextDestroyed(ServletContextEvent sce) {
        ServletContext sc = sce.getServletContext();
        sc.removeAttribute(Constantes.IdClass);
    }
}

Enfin pour que le listener soit chargé (et donc nos fameuses constantes) au démarrage de l’application, il ne reste plus qu’à ajouter la déclaration du listener au fichier
web.xml (à la racine de ) :

    <listener>
        <description>ServletContextListener</description>
        <listener-class>org.struts.test.listener.StrutsTestAppListener</listener-class>
    </listener>

Et voilà, le tour est joué. On peut maintenant écrire :

<c:fil test='${monForm.userProfil == Constantes.PROFIL_ADMIN}'>
    <p>Salut Admin </p>
</c:if>

Héhé elle est pas belle la vie ?! :)

Laisser un commentaire

Catégories
Nuage de Tags