Freemarker выполняет итерацию по клавишам hashmap

У Freemarker есть два типа данных коллекции, списки и hashмапы. Есть ли способ перебирать ключи hashmap так же, как мы делаем со списками?

Поэтому, если у меня есть var с данными, скажем:

user : { name : "user" email : "[email protected]" homepage : "http://nosuchpage.org" } 

Я хотел бы напечатать все свойства пользователя с их значением. Это неверно, но цель понятна:

  ${prop} = ${user.get(prop)}  

Изменить: не используйте это решение с FreeMarker 2.3.25 и выше, особенно не .get(prop) . См. Другие ответы.

Вы используете встроенную функцию клавиш , например, это должно работать:

 <#list user?keys as prop> ${prop} = ${user.get(prop)}  

FYI, похоже, что синтаксис для извлечения значений изменился в соответствии с:

http://freemarker.sourceforge.net/docs/ref_builtins_hash.html

 <#assign h = {"name":"mouse", "price":50}> <#assign keys = h?keys> <#list keys as key>${key} = ${h[key]};  

Начиная с версии 2.3.25, выполните следующие действия:

 <#list user as propName, propValue> ${propName} = ${propValue}  

Обратите внимание, что это также работает с map?api.get(key) ключами (в отличие от map[key] , которые должны были быть записаны как map?api.get(key) then).

До 2.3.25 стандартное решение было:

 <#list user?keys as prop> ${prop} = ${user[prop]}  

Однако некоторые действительно старые интеграции FreeMarker используют странную конфигурацию, в которой общедоступные методы Map (например, getClass ) отображаются в виде ключей. Это происходит, когда они используют чистый BeansWrapper (вместо DefaultObjectWrapper ), свойство simpleMapWrapper которого осталось на false . Вы должны избегать такой настройки, так как она смешивает методы с реальными записями Map . Но если вы столкнетесь с такой неудачной настройкой, способ избежать ситуации – использовать открытые Java-методы, такие как user.entrySet() , user.get(key) и т. Д., А не использовать конструкторы языка шаблона, такие как ?keys или user[key] .

Если вы используете BeansWrapper с уровнем экспозиции Expose.SAFE или Expose.ALL, тогда может использоваться стандартный Java-подход к итерации набора записей:

Например, во Фримаркере (начиная с версии 2.3.19) будет работать следующее:

 <#list map.entrySet() as entry>   

Например, в Struts2 расширение BeanWrapper используется с уровнем экспозиции по умолчанию, чтобы разрешить этот способ итерации.

Итерирование объектов

Если ваши ключи карты являются объектом, а не строкой, вы можете повторить его с помощью Freemarker.

1) Преобразуйте карту в список в controllerе:

 List> convertedMap = new ArrayList(originalMap.entrySet()); 

2) Итерировать карту в шаблоне Freemarker, обращаясь к объекту в ключе и объекте в значении:

 <#list convertedMap as item> <#assign myObjectKey = item.getKey()/> <#assign myObjectValue = item.getValue()/> [...]  

Вы можете использовать одну цитату для доступа к ключу, установленному в вашей программе Java.

Если вы установите карту в Java, как это

 Map hash = new HashMap(); hash.put("firstname", "a"); hash.put("lastname", "b"); Map map = new HashMap(); map.put("hash", hash); 

Тогда вы можете получить доступ к членам хеша в Freemarker, как это –

 ${hash['firstname']} ${hash['lastname']} 

Вывод :

 a b 

Для полноты, стоит упомянуть, что с недавнего времени существует достойная обработка пустых коллекций в Freemarker.

Таким образом, самый удобный способ итерации карты:

 <#list tags> 
    <#items as tagName, tagCount>
  • {$tagName} (${tagCount})
<#else>

No tags found.

Больше <#if ...> оберток.

  • Как определить примитивный тип примитивной переменной?
  • Проверка строки для непечатаемых символов при чтении текстового файла
  • Предотrotation множественного входа с использованием одного и того же имени пользователя и пароля
  • Может ли интерфейс расширять несколько интерфейсов в Java?
  • Принуждение нескольких streamов к использованию нескольких процессоров, когда они доступны
  • Повернуть BufferedImage внутри JPanel
  • Компиляция java-программы в исполняемый файл
  • Как получить реальный путь Java-приложения во время выполнения?
  • Простая Java-клиентская / серверная программа
  • Как использовать Junit для тестирования асинхронных процессов
  • Почему не вызывает статический метод путем экземпляра ошибки для компилятора Java?
  • Давайте будем гением компьютера.