2008-09-26 11 views
12

Ich habe eine Enum wie dieseIterieren über Enum-Konstanten in JSP

package com.example; 

public enum CoverageEnum { 

    COUNTRY, 
    REGIONAL, 
    COUNTY 
} 

Ich mag würde diese Konstanten in JSP iterieren ohne scriptlet Code. Ich weiß, ich kann es mit scriptlet Code wie folgt:

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

Aber kann ich die gleiche Sache ohne Scriptlets erreichen?

Cheers, Don

Antwort

5

Wenn Sie Tag verwenden Bibliotheken Sie den Code innerhalb einer EL-Funktion kapseln könnte. Also das Starttag würde:

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

EDIT: Als Reaktion auf die Diskussion über eine Implementierung, die nur für mehrere Enum-Typen funktionieren würde dies skizziert:

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

Wenn ich es auf diese Art und Weise kann ich brauchen würde, um eine EL-Funktion für jede Enumeration zu definieren, was eine wäre echter Schmerz. Es wäre vorzuziehen, eine einzelne Funktion zu definieren, die für alle Enums (wahrscheinlich über Reflektion) funktioniert. Aber sicherlich existiert eine solche Funktion in einigen JSP Taglibs? –

+0

Es kann gut sein, aber ich weiß nicht, es hatte nur einen gehen: public static > Enum [] getValues ​​(Klasse klass) { \t try { \t \t Methode m = klass. getMethod ("Werte", null); \t \t Object obj = m.invoke (null, null); \t \t zurück (Enum []) obj; \t} catch (Ausnahme ex) { \t \t Rückgabe null; \t} } –

+0

Gute Arbeit. Boy, ist das Typ Parameter > hässlich! Ich kritisiere hier die Java-Generics-Implementierung, nicht Ihren Code. Ich bin selbst zu ähnlichen Abscheulichkeiten gezwungen worden. Danke für den Code. –

7

Wenn Sie mit Spring MVC,

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

wo Ihr Modell Attribut (dh Bohne/Dateneinheit zu füllen) wird als Cluster und Sie haben bereits bevölkert th: Sie können Ihr Ziel mit dem folgenden syntaktischen Segen erreichen e Modell mit einem Enumerationsfeld mit Werten namens clusterTypes. Der <form:error> Teil ist sehr optional.

In Spring MVC Land, können Sie auch clusterTypes in Ihre Modell-auto bevölkern wie diese

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