перебирая константы Enum в JSP - PullRequest
       40

перебирая константы Enum в JSP

12 голосов
/ 27 сентября 2008

У меня есть такой Enum

package com.example;

public enum CoverageEnum {

    COUNTRY,
    REGIONAL,
    COUNTY
}

Я бы хотел перебрать эти константы в JSP без использования кода скриптлета. Я знаю, что могу сделать это с помощью кода скриптлета:

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

Но можно ли добиться того же самого без скриплетов?

Ура, Don

Ответы [ 2 ]

7 голосов
/ 04 октября 2010

Если вы используете 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>

где ваш атрибут модели (т. Е. Объект EJB / данных для заполнения) называется кластером, и вы уже заполнили модель перечислимым массивом значений с именем clusterTypes. Часть <form:error> очень необязательна.

В Spring MVC land вы также можете автоматически заполнить clusterTypes в своей модели следующим образом

@ModelAttribute("clusterTypes")
public MyClusterType[] populateClusterTypes() {
    return MyClusterType.values();
}
5 голосов
/ 27 сентября 2008

Если вы используете библиотеки тегов, вы можете инкапсулировать код в функцию EL. Таким образом, открывающий тег станет:

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

РЕДАКТИРОВАТЬ: В ответ на обсуждение реализации, которая будет работать для нескольких типов Enum, просто набросал это:

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;
    }
}
...