2008-09-26 8 views
12

Mam Enum jak tenIteracja nad Enum stałych w JSP

package com.example; 

public enum CoverageEnum { 

    COUNTRY, 
    REGIONAL, 
    COUNTY 
} 

Chciałbym iteracyjne nad tych stałych w JSP bez użycia kodu skrypty. Wiem, że mogę to zrobić za pomocą kodu skryptu w ten sposób:

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

Ale czy mogę osiągnąć to samo bez skryptletów?

Cheers, Don

Odpowiedz

5

Jeśli używasz Tag Biblioteki można otoczyć kod wewnątrz funkcji EL. Więc tag otwarcie staną:

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

EDIT: W odpowiedzi na dyskusję o implementacji, że będzie pracować dla wielu typów Enum tylko naszkicował to:

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

Jeśli zrobić to w ten sposób, że trzeba zdefiniować funkcję EL dla każdego wyliczenia, który byłby prawdziwy ból. Zdefiniowanie pojedynczej funkcji, która działa dla wszystkich wyliczeń (prawdopodobnie poprzez odbicie) byłoby lepsze. Ale z pewnością taka funkcja już istnieje w niektórych taglib JSP? –

+0

Może okazać się, ale nie wiem o tym, po prostu musiałem iść: static publicznego > Enum [] getValues ​​(klasa klass) { \t try { \t \t Metoda m = klass. getMethod ("wartości", null); \t \t Obiekt obj = m.invoke (null, null); \t \t return (Enum []) obj; \t} catch (Exception ex) { \t \t return null; \t} } –

+0

Dobra robota. Chłopcze, czy ten parametr typu > jest brzydki! Krytykuję implementację generycznych Java tutaj, a nie twój kod. Sam byłem zmuszany do podobnych obrzydliwości. Dzięki za kod. –

7

Jeśli używasz wiosennym MVC można osiągnąć swój cel z następującym składniowej błogosławieństwa:

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

gdzie atrybut modelu (czyli podmiot fasoli/dane do wypełnienia) nosi nazwę klastra i już zaludnione th e model z wyliczającą tablicą wartości o nazwie clusterTypes. Część <form:error> jest bardzo opcjonalna.

w Spring MVC ziemi, można również automatycznego zapełniania clusterTypes w modelu jak ten

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