我有许多以整数作为键的哈希表,我希望能够在我的Freemarker模板中迭代它们,但是,似乎没有任何效果。
我尝试了Freemarker iterating over hashmap keys中的示例:
<#list user.props() as prop>
${prop} = ${user.get(prop)}
</#list>
它可能适用于Strings作为键,但它不适用于Integers。我甚至无法通过具体值从哈希表中检索值。我拥有的是:
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。我将哈希表转换为将其传递给模板,但这似乎是一种解决方法。
祝你好运, 提莫菲
答案 0 :(得分:7)
对于那些跟随我的脚步的人。 显然,FreeMarker无法使用带有参数的Hashtables。所以我最终创建了这些哈希表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>
祝你好运,力量可能与你同在:)
答案 1 :(得分:2)
这是旧问题,FTL的哈希类型不像Java的Map
,而是only supports string keys。但是,从2.3.22开始,你可以使用someMap?api.get(someNonStringKey)
来解决这个问题。它需要一些配置才能启用,但不会破坏现有应用程序。请参阅this answer或this FAQ entry。