2011-01-05 2 views
4

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

Я попробовал пример из Freemarker iterating over hashmap keys:


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

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

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

(DataModel быть HashMap передается в шаблон).

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


<#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. Я преобразовал хэш-таблицу из в, чтобы передать ее в шаблон, но это похоже на обходное решение.

С наилучшими пожеланиями, Тимофея

ответ

7

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


<#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> 

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

+2

Действительно проблема заключается в том, что FreeMarker может обрабатывать хэши только с ключами типа String. – idrosid

+0

Теперь это лучшее решение (используя '? Api'); см. [этот пункт часто задаваемых вопросов] (http://freemarker.org/docs/app_faq.html#faq_nonstring_keys). – ddekany

1

Это старая проблема, что хеш-тип FTL не похож на Java Map, и он only supports string keys. Но с 2.3.22 вы можете использовать someMap?api.get(someNonStringKey) для работы. Он нуждается в некоторой настройке для включения, но ничего не нарушает существующее приложение. См. this answer или this FAQ entry.

Смежные вопросы