[英]Freemarker iterating over hashmap keys
Freemarker有两种集合数据类型,列表和hashmaps有没有办法迭代hashmap键,就像我们对列表一样?
所以,如果我有一个带数据的var,那就说:
user : {
name : "user"
email : "looser@everything.com"
homepage : "http://nosuchpage.org"
}
我想用它们的值打印所有用户的属性。 这是无效的,但目标很明确:
<#list user.props() as prop>
${prop} = ${user.get(prop)}
</#list>
编辑:不要在FreeMarker 2.3.25及更高版本中使用此解决方案,尤其不要使用.get(prop)
。 看到其他答案。
您使用内置键功能,例如,这应该工作:
<#list user?keys as prop>
${prop} = ${user.get(prop)}
</#list>
仅供参考,看起来检索值的语法已根据以下内容进行了更改:
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>
从2.3.25开始,就像这样:
<#list user as propName, propValue>
${propName} = ${propValue}
</#list>
请注意,这也适用于非字符串键(与map[key]
不同, 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
这样的模板语言结构?keys
或user[key]
。
如果使用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中, BeanWrapper的扩展使用默认的暴露级别以允许这种迭代方式。
如果您的地图键是一个对象而不是一个字符串,您可以使用Freemarker进行迭代。
1)将地图转换为控制器中的列表:
List<Map.Entry<myObjectKey, myObjectValue>> convertedMap = new ArrayList(originalMap.entrySet());
2)在Freemarker模板中迭代地图,访问Key中的对象和Value中的Object:
<#list convertedMap as item>
<#assign myObjectKey = item.getKey()/>
<#assign myObjectValue = item.getValue()/>
[...]
</#list>
您可以使用单引号访问您在Java程序中设置的密钥。
如果你像这样在Java中设置Map
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);
然后你可以像这样访问Freemarker中'hash'的成员 -
${hash['firstname']}
${hash['lastname']}
输出:
a
b
为了完整起见,值得一提的是,自最近以来,Freemarker中的空集合处理得体。
所以迭代地图最方便的方法是:
<#list tags>
<ul class="posts">
<#items as tagName, tagCount>
<li>{$tagName} (${tagCount})</li>
</#items>
</ul>
<#else>
<p>No tags found.</p>
</#list>
不再有<#if ...>
包装。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.