2008-09-26 13 views
12

tengo una enumeración como estointeractuando sobre las constantes de enumeración en JSP

package com.example; 

public enum CoverageEnum { 

    COUNTRY, 
    REGIONAL, 
    COUNTY 
} 

quisiera iterar sobre estas constantes en JSP sin usar código scriptlet. Sé que puedo hacerlo con código scriptlet como esto:

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

Pero puedo lograr lo mismo sin scriptles?

Cheers, Don

Respuesta

5

Si está utilizando Tag Libraries se podría encapsular el código dentro de una función de EL. Por lo que la etiqueta de apertura se convertiría en:

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

EDIT: En respuesta a la discusión acerca de una aplicación que funcione para varios tipos Enum simplemente esbozado esto:

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 lo hago de esta manera que había necesidad de definir una función de EL para cada enumeración, lo que sería una dolor real. Definir una función única que funcione para todas las enumeraciones (probablemente a través de la reflexión) sería preferible. Pero seguramente esa función ya existe en algún taglib JSP? –

+0

Muy bien puede haber pero no sé de él, sólo tenía un ir: estática público > Enum [] getValues ​​(Clase Klass) { \t try { \t \t Método m = Klass. getMethod ("valores", nulo); \t \t Objeto obj = m.invoke (null, null); \t \t return (Enum []) obj; \t} catch (Excepción ex) { \t \t return null; \t} } –

+0

Buen trabajo. Chico, es ese tipo de parámetro > feo! Estoy criticando la implementación de los genéricos de Java aquí, no su código. Me he visto obligado a abominaciones similares yo mismo. Gracias por el código –

7

Si está utilizando Spring MVC, usted puede lograr su objetivo con la siguiente bendición sintáctica:

<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> 

donde su atributo modelo (es decir, bean de entidad/datos para rellenar) es el nombre del clúster y que ya han poblado º El modelo con una matriz de valores enum llamada clusterTypes. La parte <form:error> es muy opcional.

En Spring MVC tierra, también puede rellenar automáticamente clusterTypes en su modelo como este

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