Карта доступа <Enum, Object> в JSTL

У меня есть:

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

Ответ 1

Вы не можете. Лучше всего изменить карту, чтобы использовать 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, чтобы сделать это выше, если вы не можете/не хотите менять карту.

Ответ 2

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

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

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

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

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

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

${map[ONE]}

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

Ответ 3

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

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

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

Ответ 4

${map[MyEnum.One]}

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

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