Карта доступа <Enum, Object> в JSTL - PullRequest
11 голосов
/ 12 октября 2009

у меня есть:

public enum MyEnum{
    One, Two, Three
}

Из контроллера я вставил в модель:

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

Как мне в моем JSTL получить доступ к объекту на карте для перечисления ключей MyEnum.One, аккуратно?

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

и не

${map[MyEnum.One]}

Ответы [ 4 ]

15 голосов
/ 13 апреля 2011

Это не совсем верно, что вы не можете сделать это, но решение не совсем простое. Проблема в том, что EL не преобразует передаваемую вами строку в качестве ключа карты в соответствующее для вас перечисление, поэтому при установке $ {map ['One']} не используется константа перечисления MyEnum.One при поиске карты.

Я столкнулся с той же проблемой и не хотел возвращаться к работе с картой со строковым ключом, поэтому проблема была в JSTL, как получить фактическую ссылку на перечисление для использования при поиске карты.

Требуется ввести константы Enum в область действия JSP, чтобы вы могли затем использовать сам Enum в качестве ключа. Для этого в контроллере вы делаете что-то вроде этого:

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

Что вы сделали здесь, так это добавили переменные в область видимости, названную строковым представлением перечисления. (Конечно, вы можете избежать проблем с именами, добавив в e.toSring () некоторое значение)

Теперь, когда вы делаете следующее

${map[ONE]}

Вы будете использовать фактическую константу перечисления в качестве ключа и, следовательно, получите правильное соответствующее значение с карты. (обратите внимание, что вокруг ONE нет кавычек, потому что в этом случае вы ссылаетесь на атрибут запроса ONE, который был добавлен выше)

11 голосов
/ 12 октября 2009

Вы не можете. Лучше всего поменять карту на использование enum.name () в качестве ключа:

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

Ваш первый подход будет работать тогда:

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

Или вы можете написать пользовательскую функцию EL, чтобы выполнить вышеуказанное для вас, если вы не можете / не хотите менять карту.

1 голос
/ 16 декабря 2016

Я обычно использую это решение:

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

Сначала я импортирую enum. Затем я сохраняю желаемое значение перечисления в переменную JSTL. Затем я могу получить доступ к карте с этой переменной в качестве ключа.

0 голосов
/ 16 ноября 2015
${map[MyEnum.One]}

Это работает для меня. Но вы должны написать полное имя вашего класса: my.package.MyEnum или импортировать класс MyEnum:

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