迭代JSP中的Enum常量

时间:2008-09-26 20:00:19

标签: java jsp enums scriptlet

我有一个这样的Enum

package com.example;

public enum CoverageEnum {

    COUNTRY,
    REGIONAL,
    COUNTY
}

我想在JSP中迭代这些常量而不使用scriptlet代码。我知道我可以用这样的scriptlet代码来实现它:

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

但是如果没有scriptlet,我可以实现同样的目标吗?

干杯, 唐

2 个答案:

答案 0 :(得分:7)

如果你正在使用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>

其中您的模型属性(即要填充的bean / data实体)被命名为cluster,并且您已使用名为clusterTypes的枚举值数组填充模型。 <form:error>部分是非常可选的。

在Spring MVC中,你也可以像这样自动填充clusterTypes到你的模型中

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

答案 1 :(得分:5)

如果您使用的是标记库,则可以将代码封装在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;
    }
}