Freemarker, перебирающий ключи hashmap

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

Итак, если у меня есть переменная с данными, скажем:

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

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

<#list user.props() as prop>
  ${prop} = ${user.get(prop)}
</#list>
78 голосов | спросил tzador 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 30 Sep 2009 16:22:02 +0400 2009, 16:22:02

7 ответов


0

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

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

<#list user?keys as prop>
    ${prop} = ${user.get(prop)}
</#list>  
ответил skaffman 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 30 Sep 2009 16:27:19 +0400 2009, 16:27:19
0

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

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]}; </#list>
ответил Nick Spacek 30 MarpmWed, 30 Mar 2011 21:24:00 +04002011-03-30T21:24:00+04:0009 2011, 21:24:00
0

Начиная с 2.3.25, сделайте это так:

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

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

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

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

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

ответил ddekany 8 J000000Friday16 2016, 20:25:29
0

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

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

<#list map.entrySet() as entry>  
  <input type="hidden" name="${entry.key}" value="${entry.value}" />
</#list>

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

ответил rees 7 Maypm12 2012, 18:48:54
0

Итерация объектов

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

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

List<Map.Entry<myObjectKey, myObjectValue>> convertedMap  = new ArrayList(originalMap.entrySet());

2) Выполните итерацию карты в шаблоне Freemarker, получив доступ к объекту в ключе и объекту в значении:

<#list convertedMap as item>
    <#assign myObjectKey = item.getKey()/>
    <#assign myObjectValue = item.getValue()/>
    [...]
</#list>
ответил Tk421 20 J0000006Europe/Moscow 2015, 11:42:08
0

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

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

Map<String,Object> hash = new HashMap<String,Object>();
hash.put("firstname", "a");
hash.put("lastname", "b");

Map<String,Object> map = new HashMap<String,Object>();
map.put("hash", hash);

Затем вы можете получить доступ к элементам 'hash' во Freemarker следующим образом -

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

Вывод:

a
b
ответил Ashish Chhabria 19 MarpmThu, 19 Mar 2015 21:28:55 +03002015-03-19T21:28:55+03:0009 2015, 21:28:55
0

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

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

<#list tags>
<ul class="posts">
    <#items as tagName, tagCount>
        <li>{$tagName} (${tagCount})</li>
    </#items>
</ul>
<#else>
    <p>No tags found.</p>
</#list>

Не более <#if ...> обертки.

ответил Ondra Žižka 23 J000000Monday18 2018, 19:09:56

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132