2009-10-11 2 views
10

ich habe:Zugang Map <Enum, Objekt> in JSTL

public enum MyEnum{ 
    One, Two, Three 
} 

vom Regler, ich im Modell setzen:

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

Wie kann ich in meinem JSTL Zugang das Objekt in der Karte für Schlüssel Enum MyEnum.One, in einer ordentlichen Art und Weise?

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

noch hat

${map[MyEnum.One]} 

Antwort

11

können Sie nicht. Ihre beste Wette ist Ihre Karte ändern enum.name() als Schlüssel zu verwenden:

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

Ihr erster Ansatz funktionieren würde, dann:

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

Oder Sie können eine benutzerdefinierten EL Funktion schreiben, die zu tun Oben für Sie, wenn Sie die Karte nicht ändern können/wollen.

+0

Verwenden Sie die benutzerdefinierte el-Funktion - es ist die wartungsfreundlichste Art und Weise. – Chii

13

Es ist nicht genau wahr, dass Sie es nicht tun können, aber die Lösung ist nicht ganz geradlinig. Das Problem ist, dass EL die Zeichenfolge, die Sie als Map-Schlüssel übergeben, nicht in die entsprechende Enumeration für Sie konvertiert. Daher verwendet $ {map ['One']} nicht die Enum-Konstante MyEnum.One in der Map-Suche.

Ich stieß auf das gleiche Problem und wollte nicht mit einem String-Keyed-Map zurückgehen, so war die Herausforderung dann in JSTL, wie die tatsächliche Enum-Referenz in der Map-Lookup verwendet werden.

Erforderlich ist, die Enum-Konstanten in den Bereich der JSP zu bekommen, damit Sie dann die eigentliche Enum selbst als Schlüssel verwenden können. Um dies zu tun, in der Steuerung Sie etwas tun, wie folgt aus:

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

Was haben Sie hier gemacht wird Variablen in den Anwendungsbereich wie die String-Darstellung des Enum genannt hinzugefügt. (Sie könnten natürlich Namensgebung Probleme vermeiden, indem Sie die e.toSring vorangestellt() mit einem Wert)

Nun, wenn Sie die folgenden

${map[ONE]} 

tun, werden Sie die tatsächliche Enum werden mit konstanter als Schlüssel und wird daher den entsprechenden Wert von der Karte erhalten. (Bemerken gibt es keine Anführungszeichen ONE, das ist, weil Sie die Anfrage Attribut ONE in diesem Fall verweisen, das wurde oben hinzugefügt)

+0

Huh! Kreative Lösung!:) –

+2

Ganz nett, solange Sie keine Aufzählungen mit gleichnamigen Konstanten verwenden müssen. –

0
${map[MyEnum.One]} 

Es funktioniert für mich. Aber Sie müssen den vollständigen Namen der Klasse schreiben: my.package.MyEnum oder MyEnum Klasse importieren:

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

Es funktioniert auf Pivotal TC Server 3.1.1 (von STS) und Tomcat 8.0.28, aber es funktioniert nicht auf Tomcat 8.0.14 –

1

ich in der Regel mit dieser Lösung:

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

Zuerst habe ich die Enum importieren. Dann speichere ich den gewünschten Enum-Wert in JSTL-Variable. Dann kann ich mit dieser Variable als Schlüssel auf die Karte zugreifen.