2010-10-20 16 views
8

Mam listę stałych zadeklarowane w java za pomocą typu enum, który musi pojawić się w jsp. Java deklaracja ENUM:JSTL foreach na 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> 

gdzie jako:

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

działa dobrze. Czy istnieje ograniczenie dotyczące typu enum ni foreach loop?

+2

Możliwy duplikat [Iterowanie nad stałych Enum w JSP] (http: // stackoverflow .pl/questions/141611/iterating-over-enum-constants-in-jsp) – Stewart

Odpowiedz

3

Metoda wartości działa dobrze, mój błąd. Rzeczywiście problem polegał na tym, że nie umieściłem mojej listy w zakresie strony mojego jsp.

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

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

bez potrzeby metody getNames

0

EL, którego używasz w atrybucie items na c: forEach próbuje wywołać metodę statyczną na twoich typach wyliczeniowych. Uważam, że EL obsługuje tylko wywołania metod instancji.

1

Możesz utworzyć metodę, która zwraca Enum.values(), jeśli nie możesz użyć wartości bezpośrednio w wyrażeniu EL.

Usuń z wnętrza Enum getNames() i użyj takiej metody zamiast w innym miejscu kodu.

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

Inną opcją jest użycie <c:set/> tag jak takie:

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

Następnie wystarczy iteracyjne nad nim jako takie:

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

Twój IDE powinien monitować o zaimportowanie klasy YourEnum.

+0

Nie miałem potrzeby wykonywania xer21

2

Innym prostym sposobem może być:

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

trzeba importować te:

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