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 ...> оберток.

  • Использование SHA1 и RSA с java.security.Signature против MessageDigest и Cipher
  • Не найдено ни одного приложения для журнала (log4j)?
  • Java - Как создать новую запись (ключ, значение)
  • Как проверить, что строка обрабатывается двойным?
  • Переменная, используемая в lambda-выражении, должна быть окончательной или эффективно конечной
  • Как вы вставляете двоичные данные в XML?
  • Как реализовать одно приложение Java-приложения?
  • Как использовать ArgumentCaptor для stubbing?
  • Как вызвать setUndecorated () после того, как кадр становится видимым?
  • Как получить уникальный идентификатор компьютера в Java (например, идентификатор диска или идентификатор материнской платы)?
  • Как включить TLS 1.2 в Java 7
  • Interesting Posts

    При установке дополнительного принтера 32-разрядные драйверы не работают в 64-разрядной версии Windows 7, я получаю сообщение об ошибке «Выбранный драйвер принтера не найден», что мне делать?

    Переустановите предустановленную Windows 7 на ноутбук Toshiba

    Пакет Java не содержит ошибки

    Android Studio: Не удалось синхронизировать Gradle: не удалось HEAD ‘…’. Получен код статуса 502 с сервера: Bad Gateway

    Как определить версию Intel Management Engine на Linux?

    PDF-документы для склейки (наложения)

    Шаблон регулярного выражения для HH: MM: временная строка SS

    Почему локальные переменные, включая примитивы, всегда инициализируются в Java?

    Пользовательский макет для DialogFragment OnCreateView и OnCreateDialog

    Общие рекомендации по предотвращению утечек памяти на C ++

    gdb – отладка с помощью трубы

    Как использовать Integer без знака в Java 8 и Java 9?

    Что такое Apache Camel?

    Cisco VPN перестает просматривать Windows 7

    Как отправить java.util.logging в log4j?

    Давайте будем гением компьютера.