2009-10-11 8 views
10

ho:Mappa d'accesso <Enum, oggetto> in JSTL

public enum MyEnum{ 
    One, Two, Three 
} 

Da controllore, ho messo nel modello:

HashMap<MyEnum, Long> map = new HashMap<MyEnum, Long>(); 
map.put(MyEnum.One, 1L); 
mav.addObject("map", map); 

Come faccio a mio accesso JSTL l'oggetto nella mappa per enum chiave MyEnum.One, in modo pulito?

${map['One']} //does not seem to work... 

${map[MyEnum.One]} 

risposta

11

Non è possibile. La cosa migliore è quello di cambiare la vostra mappa da utilizzare enum.name() come chiave:

HashMap<String, Long> map = new HashMap<String, Long>(); 
map.put(MyEnum.One.name, 1L); 
map.addObject("map", map); 

Il tuo primo approccio potrebbe funzionare allora:

${map['One']} // works now 

Oppure si può scrivere una funzione EL personalizzato per fare il sopra per te se non puoi/non vuoi cambiare la mappa.

+0

utilizza la funzione el personalizzata - è il modo più gestibile. – Chii

13

Non è esattamente vero che non è possibile farlo, ma la soluzione non è completamente semplice. Il problema è che EL non sta convertendo la stringa passata come chiave della mappa per l'enum corrispondente, quindi mettere $ {map ['One']} non usa la costante enum MyEnum.One nella ricerca della mappa.

Mi sono imbattuto nello stesso problema e non volevo tornare ad andare con una mappa con chiave String, quindi la sfida era in JSTL come ottenere il riferimento effettivo enum da utilizzare nella ricerca mappa.

Ciò che è necessario è ottenere le costanti Enum nell'ambito del JSP in modo da poter utilizzare l'Enum stesso come chiave. A questo scopo, nel controllore si fa qualcosa di simile:

for (MyEnum e : MyEnum.values()) { 
    request.putAttribute(e.toString(), e); 
} 

Quello che hai fatto qui viene aggiunto variabili nel campo di applicazione di nome come rappresentazione di stringa della enum. (Si può ovviamente evitare di nominare i problemi anteponendo l'e.toSring() con un certo valore)

Ora, quando si esegue il seguente

${map[ONE]} 

Si prevede di utilizzare l'enumerazione effettiva costante come chiave e ritornerà quindi il valore corrispondente appropriato dalla mappa. (Notare non ci sono virgolette attorno ONE, è perché si fa riferimento l'attributo richiesta di uno in questo caso, che è stata aggiunta al di sopra)

+0

Huh! Soluzione creativa!:) –

+2

Abbastanza carino finché non è necessario utilizzare le enumerazioni con costanti con lo stesso nome. –

0
${map[MyEnum.One]} 

Funziona per me. Ma bisogna scrivere il nome completo della classe: my.package.MyEnum o importare classe MyEnum:

<%@page import="my.package.MyEnum"%> 
+0

Funziona su Pivotal tc Server 3.1.1 (da STS) e Tomcat 8.0.28, ma non funziona su Tomcat 8.0.14 –

1

io di solito uso questa soluzione:

<%@page import="my.package.MyEnum"%> 
<c:set var="One" value="<%=MyEnum.One %>" /> 
<c:set var="MyEnum_values" value="${map[One]}" /> 

In primo luogo, ho importare l'enum. Quindi, salverò il valore enum che voglio nella variabile JSTL. Quindi posso accedere alla mappa con questa variabile come chiave.