Карта доступа <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"%>