• Aucun résultat trouvé

Utilisation de constantes

Dans le document Cours J2EE Approfondi (Page 170-172)

Afin de faciliter la lecture et la modification du code d'une classe, il est recommandé de ne pas écrire le contenu des attributs de type primitifs en dur au sein de votre code, et de les regrouper sous forme de constantes en début de classe afin d'y centraliser les données.

Reprenons par exemple notre servlet d'exemple, où vous pouvez voir aux lignes 42 à 45 et 48 des String initialisées directement dans le code :

Code : Java - com.sdzee.servlets.Test

package com.sdzee.servlets;

import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.joda.time.DateTime; import com.sdzee.beans.CoyoteBean;

public class Test extends HttpServlet {

public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException{

/** Création et initialisation du message. */

String message = "Message transmis de la servlet à la JSP.";

/** Création du bean et initialisation de ses propriétés */

CoyoteBean premierBean = new CoyoteBean();

premierBean.setNom( "Coyote" );

premierBean.setPrenom( "Wile E." );

/** Création de la liste et insertion de quatre éléments */

List<Integer> premiereListe = new ArrayList<Integer>();

premiereListe.add( 27 );

premiereListe.add( 12 );

premiereListe.add( 138 );

premiereListe.add( 6 );

/** On utilise ici la libraire Joda pour manipuler les dates, pour deux raisons :

les objets Date ou Calendar !

* - c'est (probablement) un futur standard de l'API Java. */

DateTime dt = new DateTime();

Integer jourDuMois = dt.getDayOfMonth();

/** Stockage du message, du bean et de la liste dans l'objet request */

request.setAttribute( "test", message );

request.setAttribute( "coyote", premierBean );

request.setAttribute( "liste", premiereListe );

request.setAttribute( "jour", jourDuMois );

/** Transmission de la paire d'objets request/response à notre JSP */

this.getServletContext().getRequestDispatcher( "/WEB-INF/test.jsp" ).forward( request, response );

} }

Les lignes 20, 24 à 25 et 29 à 32, bien qu'elles contiennent des String et int en dur, correspondent simplement à l'initialisation des données d'exemple que nous transmettons à notre JSP : ce sont des données "externes". Dans le cas d'une application réelle, ces données seront issues de la base de données, du modèle ou encore d'une saisie utilisateur, mais bien évidemment jamais directement issues de la servlet comme c'est le cas dans cet exemple.

En ce qui concerne les String initialisées en dur, vous devez remarquer qu'elles ne contiennent que des données "internes" : en l'occurrence, un nom de page JSP et quatre noms d'attributs. Il s'agit bien ici de données propres au fonctionnement de l'application et non pas de données destinées à être transmises à la vue pour affichage.

Eh bien comme je vous l'ai annoncé, une bonne pratique est de remplacer ces initialisations directes par des constantes, regroupées en tête de classe. Voici donc le code de notre servlet après modification :

Code : Java - com.sdzee.servlets.Test

package com.sdzee.servlets;

import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.joda.time.DateTime; import com.sdzee.beans.CoyoteBean;

public class Test extends HttpServlet {

public static final String ATT_MESSAGE = "test";

public static final String ATT_BEAN = "coyote";

public static final String ATT_LISTE = "liste";

public static final String ATT_JOUR = "jour";

public static final String VUE = "/WEB-INF/test.jsp";

public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException{

/** Création et initialisation du message. */

String message = "Message transmis de la servlet à la JSP.";

/** Création du bean et initialisation de ses propriétés */

CoyoteBean premierBean = new CoyoteBean();

premierBean.setNom( "Coyote" );

premierBean.setPrenom( "Wile E." );

/** Création de la liste et insertion de quatre éléments */

List<Integer> premiereListe = new ArrayList<Integer>();

premiereListe.add( 27 );

premiereListe.add( 12 );

premiereListe.add( 138 );

premiereListe.add( 6 );

/** On utilise ici la libraire Joda pour manipuler les dates, pour deux raisons :

* - c'est tellement plus simple et limpide que de travailler avec les objets Date ou Calendar !

* - c'est (probablement) un futur standard de l'API Java. */

DateTime dt = new DateTime();

Integer jourDuMois = dt.getDayOfMonth();

/** Stockage du message, du bean et de la liste dans l'objet request */

request.setAttribute( ATT_MESSAGE, message );

request.setAttribute( ATT_BEAN, premierBean );

request.setAttribute( ATT_LISTE, premiereListe );

request.setAttribute( ATT_JOUR, jourDuMois );

/** Transmission de la paire d'objets request/response à notre JSP */

this.getServletContext().getRequestDispatcher( VUE ).forward(

request, response ); }

}

Vous visualisez bien ici l'intérêt d'une telle pratique : en début de code sont accessibles en un coup d’œil toutes les données utilisées en dur au sein de la classe. Si vous nommez intelligemment vos constantes, vous pouvez alors, sans avoir à parcourir le code, savoir quelle constante correspond à quelle donnée. Ici par exemple, j'ai préfixé les noms des attributs de requête par "ATT_" et nommé "VUE" la constante contenant le chemin vers notre page JSP. Ainsi, si vous procédez plus tard à une modification sur une de ces données, il vous suffira de modifier la valeur de la constante correspondante et vous n'aurez pas besoin de parcourir votre code. C'est d'autant plus utile que votre classe est volumineuse : plus long est votre code, plus pénible il sera d'y chercher les données initialisées en dur.

Dorénavant, dans tous les exemples de code à venir dans la suite du cours, je mettrai en place de telles constantes.

Dans le document Cours J2EE Approfondi (Page 170-172)