Freemarker Hashtable‹Integer, String›, итерация по ключам

У меня есть несколько хэш-таблиц с целыми числами в качестве ключей, и я хочу иметь возможность перебирать их в своих шаблонах Freemarker, однако, похоже, ничего не работает.

Я попробовал пример из Freemarker, перебирающий ключи hashmap:


<#list user.props() as prop>
   ${prop} = ${user.get(prop)}
</#list>

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

Hashtalbe ht = new Hashtable();
ht.put(1, "hello");
datamodel.put("devices", ht);

(модель данных — это хэш-карта, переданная в шаблон).

В шаблоне я делаю следующее:


<#if devices??>
 <#list devices?keys as prop>
  <p>${prop}</p>
  <p>${devices.get(1)}</p>

OR
<p>${devices.get(key)}</p>
OR
<p>${devices[key]}</p>
OR
<p>${devices[1]}</p> </#list> <#else> <p> no devices</p> </#if>

Но ничего из этого не работает. Не могли бы вы мне помочь?

PS. Я преобразовал хеш-таблицу из в, чтобы передать ее в шаблон, но это похоже на обходной путь.

С уважением, Тимофей


person Ibolit    schedule 05.01.2011    source источник


Ответы (2)


для тех из вас, кто может пойти по моим стопам. Судя по всему, FreeMarker не может работать с Hashtables с параметрами as. В итоге я создал версии этих хеш-таблиц inti, и, поскольку в моих хеш-таблицах в качестве ключей использовались числа, я смог сделать в своем шаблоне следующее:


<#list 1..100 as prop>
    <#if hashtable[prop?string]??>
        <option value='${prop}'<#if prop==selected> selected='selected'</#if>>${hashtable[prop?string]}</option>
    <#else><#break>
    </#if>
</#list>

Удачи и да прибудет с вами сила :)

person Ibolit    schedule 06.01.2011
comment
На самом деле проблема в том, что FreeMarker может обрабатывать хэши только с ключами типа String. - person idrosid; 22.03.2011
comment
Теперь для этого есть лучшее решение (используя ?api); см. эту запись часто задаваемых вопросов. - person ddekany; 01.03.2015