2008-09-26 21 views
12

J'ai un Enum comme celui-ciconstantes sur itérer Enum dans JSP

package com.example; 

public enum CoverageEnum { 

    COUNTRY, 
    REGIONAL, 
    COUNTY 
} 

Je voudrais itérer sur ces constantes dans JSP sans utiliser le code scriptlet. Je sais que je peux le faire avec le code scriptlet comme ceci:

<c:forEach var="type" items="<%= com.example.CoverageEnum.values() %>"> 
    ${type} 
</c:forEach> 

Mais puis-je obtenir la même chose sans scriptlets?

Cheers, Don

Répondre

5

Si vous utilisez Tag bibliothèques, vous pouvez encapsuler le code dans une fonction EL. Ainsi, la balise d'ouverture deviendrait:

<c:forEach var="type" items="${myprefix:getValues()}"> 

EDIT: En réponse à la discussion au sujet d'une mise en œuvre qui fonctionnerait pour plusieurs types Enum simplement esquissée ceci:

public static <T extends Enum<T>> Enum<T>[] getValues(Class<T> klass) { 
    try { 
     Method m = klass.getMethod("values", null); 
     Object obj = m.invoke(null, null); 
     return (Enum<T>[])obj; 
    } catch(Exception ex) { 
     //shouldn't happen... 
     return null; 
    } 
} 
+0

Si je le fais de cette façon que je avais besoin de définir une fonction EL pour chaque ENUM, qui serait vraie douleur. Définir une seule fonction qui fonctionne pour toutes les énumérations (probablement par réflexion) serait préférable. Mais sûrement une telle fonction existe déjà dans certains taglib JSP? –

+0

Il peut exister, mais je ne sais pas d'elle, juste eu un aller: public static > Enum [] getValues ​​(classe Klass) { \t try { \t \t Méthode m = Klass. getMethod ("values", null); \t \t Objet obj = m.invoke (null, null); \t \t return (Enum []) obj; \t} catch (Exception ex) { \t \t return null; \t} } –

+0

Beau travail. Boy, est ce paramètre de type > moche! Je critique ici l'implémentation des génériques Java, pas votre code. J'ai moi-même été contraint à des abominations similaires. Merci pour le code. –

7

Si vous utilisez Spring MVC, vous pouvez atteindre votre objectif avec la bénédiction syntaxique suivante:

<form:form method="post" modelAttribute="cluster" cssClass="form" enctype="multipart/form-data"> 
    <form:label path="clusterType">Cluster Type 
     <form:errors path="clusterType" cssClass="error" /> 
    </form:label> 
    <form:select items="${clusterTypes}" var="type" path="clusterType"/> 
</form:form> 

où votre attribut modèle (c.-à-bean entité/données à remplir) est nommé cluster et vous avez déjà peuplé e Modèle avec un tableau de valeurs enum nommé clusterTypes. La partie <form:error> est très facultative.

Dans la terre Spring MVC, vous pouvez également remplir automatiquement clusterTypes dans votre modèle comme celui-ci

@ModelAttribute("clusterTypes") 
public MyClusterType[] populateClusterTypes() { 
    return MyClusterType.values(); 
}