2010-10-20 53 views
8

Tengo una lista de contantes declarada en java usando el tipo enum, que debe aparecer en un jsp. Java declaración de enumeración:JSTL foreach en enum

public class ConstanteADMD { 


    public enum LIST_TYPE_AFFICHAGE { 
     QSDF("qsmldfkj"), POUR("azeproui"); 

     private final String name; 

     @Override 
     public String toString() { 
      return name; 
     } 

     private LIST_TYPE_AFFICHAGE(String name) { 
      this.name = name; 
     } 

     public static List<String> getNames() { 
      List<String> list = new ArrayList<String>(); 
      for (LIST_TYPE_AFFICHAGE test : LIST_TYPE_AFFICHAGE.values()) { 
       list.add(test.toString()); 
      } 
      return list; 
     } 
    } 
} 


<select name="typeAffichage" id="typeAffichage"> 
    <c:forEach var="type" items="${netcsss.outils.ConstanteADMD.LIST_TYPE_AFFICHAGE.names}"> 
     <option value="${type}">${type}</option> 
    </c:forEach> 
</select> 

donde como:

<select name="typeAffichage" id="typeAffichage"> 
    <c:choose> 
     <c:when test="${catDecla ne null}"> 
      <option 
       value="<%=catDecla.getCatDecla().getSTypeAffichage()%>" 
       selected="selected"><%=catDecla.getCatDecla().getSTypeAffichage()%></option> 
     </c:when> 
    </c:choose> 
     <%List<String> list = ConstanteADMD.LIST_TYPE_AFFICHAGE.getNames(); 
       for(String test : list) { 
      %> 
     <option value="<%=test%>"><%=test%></option> 
     <%}%> 
</select> 

funciona bien. ¿Existe alguna limitación en enum types ni foreach loop?

+2

Posible duplicado de [iteración sobre las constantes de enumeración en JSP] (http: // stackoverflow .com/questions/141611/iterating-over-enum-constants-in-jsp) – Stewart

Respuesta

3

El método de valores funciona bien, error mío. De hecho, el problema fue que no puse mi lista en el alcance de la página de mi jsp.

<% pageContext.setAttribute("monEnum", ConstanteADMD.ListTypeAffichage.values()); %> 

... 
<c:forEach var="entry" items="${monEnum}"> 
    <option>${entry.type}</option> 
</c:forEach> 

No hay necesidad del método getNames

0

El EL que está utilizando en el atributo de elementos en c: forEach está intentando llamar a un método estático en sus tipos de enumeración. Creo que EL solo admite llamadas a métodos de instancia.

1

Puede crear un método que devuelva Enum.values() si no puede usar valores directamente en su expresión EL.

Elimine getNames() de su Enum y utilice un método como este en lugar de su código.

public List<LIST_TYPE_AFFICHAGE> getNames() { 
    return new ArrayList<LIST_TYPE_AFFICHAGE>(Arrays.asList(LIST_TYPE_AFFICHAGE.values())); 
} 
14

Otra opción es utilizar una etiqueta <c:set/> como tales:

<c:set var="enumValues" value="<%=YourEnum.values()%>"/> 

A continuación, sólo iterar sobre ella como tal:

<c:forEach items="${enumValues}" var="enumValue"> 
    ... 
</c:forEach> 

Su IDE debería solicitarle que importe la clase YourEnum.

+0

No tuve necesidad de hacer xer21

2

Otra manera simple puede ser:

<c:forEach items="<%=LIST_TYPE_AFFICHAGE.values()%>" var="entry"> 
    <option>${entry.name }</option> 
</c:forEach> 

es necesario importar los siguientes:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
<%@page import="packagename.LIST_TYPE_AFFICHAGE"%>