2009-10-11 8 views
10

mam:Dostęp Mapa <Enum, Object> w JSTL

public enum MyEnum{ 
    One, Two, Three 
} 

Od kontrolera, umieścić w modelu

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

Jak mogę w moim dostępu JSTL obiekt na mapie do klucza enum MyEnum.One, w zgrabny sposób?

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

ani nie

${map[MyEnum.One]} 

Odpowiedz

11

Nie możesz. Najprościej jest zmienić mapę, aby korzystać enum.name() jako klucz:

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

Twoje pierwsze podejście byłoby pracować wtedy:

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

Albo można napisać funkcję niestandardową EL zrobić to powyżej, jeśli nie możesz/nie chcesz zmieniać mapy.

+0

użyj niestandardowej funkcji el - jest to najbardziej konserwatywny sposób. – Chii

13

To nieprawda, że ​​nie można tego zrobić, ale rozwiązanie nie jest całkowicie proste. Problem polega na tym, że EL nie konwertuje ciągu znaków, który przekazujesz jako klucz mapy, do odpowiedniego wyliczenia, więc wstawienie $ {map ['One']} nie używa stałej wyliczeniowej MyEnum.One w odnośniku do mapy.

Wpadłem na ten sam problem i nie chciałem powracać do mapy z napisem "String", więc wyzwanie w JSTL polegało na tym, jak uzyskać rzeczywiste odniesienie do użycia w wyszukiwaniu mapy.

Wymagane jest wprowadzenie stałych Enum do zakresu strony JSP, aby można było używać rzeczywistego samego Enum jako klucza. Aby to zrobić, w kontrolerze można zrobić coś takiego:

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

Co zrobiłeś tutaj dodaje zmienne do zakresu nazwanego jako ciąg znaków do wyliczenia. (Można oczywiście uniknąć nazywania problemów przez poprzedzenie e.toSring() z jakąś wartość)

Teraz, kiedy należy wykonać następujące czynności

${map[ONE]} 

Będziesz przy założeniu stałej enum jako klucz i w ten sposób odzyska odpowiednią wartość z mapy. (Zauważ brak cudzysłowów wokół jednego, że to dlatego, że odwołuje się do atrybutu poprosić w tym przypadku, który został dodany powyżej)

+0

Huh! Kreatywne rozwiązanie!:) –

+2

Całkiem niezłe, o ile nie trzeba używać wyliczeń ze stałymi o tej samej nazwie. –

0
${map[MyEnum.One]} 

To działa na mnie. Ale trzeba napisać pełną nazwę klasy: my.package.MyEnum lub zaimportować klasę MyEnum:

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

Działa na Pivotal tc Server 3.1.1 (ze STS) i Tomcat 8.0.28, ale nie działa na Tomcat 8.0.14 –

1

Zwykle używam tego rozwiązania:

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

Najpierw zaimportować enum. Następnie zapisuję wartość wyliczenia, którą chcę, w zmiennej JSTL. Wtedy mogę uzyskać dostęp do mapy z tą zmienną jako kluczem.