Gestion des énumérations avec Struts

Struts en version 1 ne supporte pas, par défaut, les énumérations au niveau des valeurs postées depuis les formulaires HTML.

Je vous propose une solution pour que Struts puisse convertir directement la valeur qui a été sélectionnée dans le formulaire HTML vers la valeur de l'énumération correspondante.

Exemple d’énumération

Comme exemple, nous prenons l'énumération sur les statuts d’un dossier :

 public enum DossierStatut {   /** Statut : Brouillon. */   BROUILLON("dossier.statut.brouillon"),   /** Statut : Nouveau. */   NOUVEAU("dossier.statut.nouveau"),   /** Statut : En cours. */   EN_COURS("dossier.statut.encours"),   /** Statut : A valider. */   A_VALIDER("dossier.statut.avalider"),   /** Statut : Clos. */   CLOS("dossier.statut.clos");   /**    * Clé de message du libellé du statut.    */   private final String libelle;   /**    * Constructeur.    * @param libelle Libellé.    */   public DossierStatut(String libelle) {     this.libelle = libelle;   }   /**    * Retourne la clé de message du libellé.    * @return Clé de message du libellé.    */   Public String getLibelle() {     return this.libelle;   } } 

Page de saisie d’une valeur énumérée

Nous prenons comme exemple une page de recherche de dossiers.

L’utilisateur peut saisir un ou plusieurs statuts de dossier à rechercher.

Cette page contient une liste de cases à cocher pour chacun des statuts.

Page JSP

 <%@ page import="fr.netapsys.exemple.model.DossierStatut"%> <form>   <%-- Parcourt tous les statuts possibles du dossier --%>   <c:forEach items="${rechercheForm.dossierStatuts}"              var="dossierStatut">     <%-- Ne pas sélectionner par défaut --%>     <c:set var="selected" value="" />     <%-- Tester si cette valeur a été précédemment sélectionnée --%>     <c:set var="selected">       <c:forEach items="${rechercheForm.dossierStatutSelecteds}"                  var="dossierStatutSelected">         <c:if test="${dossierStatut eq dossierStatutSelected}">           checked="checked"         </c:if>       </c:forEach>     </c:set>     <%-- Affichage de la case à cocher --%>     <label>       <input type="checkbox"              name="statuts"              value="${dossierStatut}"              ${selected}       />       <bean message key="${dossierStatut.libelle}" />     </label>   </c:forEach> </form> 

La boucle « c:forEach » itère sur toutes les valeurs possibles de l'énumération DossierStatut. Ces valeurs ont été obtenues à l'aide de la méthode « getDossierStatuts » du formulaire Struts « rechercheForm ».

La variable « selected » permet d'indiquer si une des valeurs a été cochée précédemment. Pour cela, nous effectuons une recherche dans la liste des valeurs précédemment sélectionnées.

Formulaire Struts

La classe RechercheForm contient une propriété « dossierStatutSelecteds » dont le type est un tableau de valeurs de l'énumération « DossierStatut ». Cette propriété contient les valeurs sélectionnées dans la page par l'utilisateur.

La méthode « getAllDossierStatuts » retourne toutes les valeurs possibles de l'énumération de « DossierStatut ».

 public RechercheForm extends ActionForm {   /**    * Statuts du dossier sélectionné.    */   private DossierStatut[] dossierStatutSelecteds;   /**    * {@inheritDoc}    */   public void reset(ActionMapping mapping,                     HttpServletRequest request)   {     super.reset(mapping,                 request);     // Réinitialiser les statuts de dossiers sélectionnés     // à chaque soumission du formulaire de recherche     this.dossierStatutSelecteds = null;   }   /**    * Retourne les statuts de dossiers sélectionnés.    * @return Statuts de dossiers sélectionnés.   public DossierStatut[] getDossierStatutSelecteds() {     return this.dossierStatutSelecteds;   }   /**    * Définit les statuts de dossiers sélectionnés.    * @param dossierStatuts Statuts de dossiers sélectionnés.    */   public void setDossierStatuts(DossierStatut[] dossierStatutSelecteds) {     this.dossierStatutSelecteds = dossierStatutSelecteds;   }   /**    * Retourne la liste de tous les statuts de dossier possibles.    * @return Statuts de dossier possibles.    */   public List<DossierStatut> getAllDossierStatuts() {     return DossierStatut.values();   } } 

Déclarer le plugin de conversion des valeurs postées dans Struts

A l"aide d'une classe de conversion, nous indiquons à Struts comment effectuer la conversion entre une des valeurs de l’énumération et la chaîne de caractères String contenant le nom correspondant dans l’énumération.

Exemple : l’utilisateur a sélectionné « En cours », la valeur sélectionnée et postée par le formulaire HTML est la chaîne de caractères « EN_COURS ». Le converteur va convertir cette chaîne de caractères en la valeur de l’énumération « DossierStatut.EN_COURS ».

Plugin de conversion de données

Tout d'abord nous déclarons le plugin de conversion de données.

 <struts-config> (...)   <!-- Conversion de données postées. -->   <plug-in     className="fr.netapsys.exemple.web.converter.plugin.ConverterPlugin"   /> (...) </struts-config> 

La méthode « init » de la classe du plugin « ConverterPlugin » permet d’indiquer les énumérations et la classe de conversion des énumérations.

 public class ConverterPlugin     implements PlugIn {   /**    * {@inheritDoc}    */   public void init(final ActionServlet servlet,                    final ModuleConfig config)   {     final EnumConverter enumConverter = new EnumConverter();     // Conversion de l’énumération DossierStatut     ConvertUtils.register(enumConverter,                           DossierStatut.class);     // TODO Ajouter les autres énumérations à convertir     // ConvertUtils.register(enumConverter,     //                       MonEnumeration.class);   } } 

Pour définir une nouvelle énumération à supporter, il suffit d'ajouter la ligne suivante de déclaration du Converter pour cette énumération :

   ConvertUtils.register(enumConverter,                         MonEnumeration.class); 

Classe de conversion

La classe de conversion est en charge de convertir la chaîne de caractères soumise par le formulaire HTML vers la valeur de l'énumération correspondante.

Cette classe permet également l'opération inverse de conversion de la valeur de l'énumération vers une chaîne de caractères.

La classe de conversion suivante est générique et peut s’utiliser pour n’importe quel type d’énumération.

 import org.apache.commons.beanutils.Converter; import org.apache.commons.lang.StringUtils; public class EnumConverter     implements Converter {   /**    * {@inheritDoc}    */   @SuppressWarnings("unchecked")   public Object convert(final Class type,                         final Object value)   {         if (value == null)         {             return null;         }         // Conversion de String vers l’énumération.         if (value instanceof String)         {             final String valueAsString = StringUtils.trimToNull((String) value);             if (valueAsString == null)             {                 return null;             }             else       {         // Recherche de la valeur de l'énumération.         Class<Enum> enum = (Class<Enum>) type;         for (final Enum enumeration : (enum.getEnumConstants())         {           if (StringUtils.equalsIgnoreCase(valueAsString,                                            enumeration.name()))           {             return enumeration;           }         }         return null;       }     }     // Conversion de l’énumération vers String.     else if (type.isInstance(value))     {       return ((Enum) value).name();     }     // Type non supporté.     else     {       return value;     }   } } 

Conclusion

Vous pouvez maintenant utiliser directement les énumérations dans vos pages JSP avec Struts.

La classe de conversion des énumérations permet d’accélérer le développement et facilite la compréhension de ce qui a été développé pour du futures évolutions.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.