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>
ska*_*man 104
编辑:不要在FreeMarker 2.3.25及更高版本中使用此解决方案,尤其不要.get(prop).看到其他答案.
您使用内置键功能,例如,这应该工作:
<#list user?keys as prop>
    ${prop} = ${user.get(prop)}
</#list>  
Nic*_*cek 51
仅供参考,看起来检索值的语法已根据以下内容进行了更改:
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>
dde*_*any 41
从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].
ree*_*ees 12
如果使用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的扩展使用默认的暴露级别以允许这种迭代方式.