Freemarker迭代hashmap键

tza*_*dor 82 java freemarker

Freemarker有两种集合数据类型,列表和hashmaps有没有办法迭代hashmap键,就像我们对列表一样?

所以,如果我有一个带数据的var,那就说:

user : {
  name : "user"
  email : "looser@everything.com"
  homepage : "http://nosuchpage.org"
}
Run Code Online (Sandbox Code Playgroud)

我想用它们的值打印所有用户的属性.这是无效的,但目标很明确:

<#list user.props() as prop>
  ${prop} = ${user.get(prop)}
</#list>
Run Code Online (Sandbox Code Playgroud)

ska*_*man 104

编辑:不要在FreeMarker 2.3.25及更高版本中使用此解决方案,尤其不要.get(prop).看到其他答案.

您使用内置功能,例如,这应该工作:

<#list user?keys as prop>
    ${prop} = ${user.get(prop)}
</#list>  
Run Code Online (Sandbox Code Playgroud)

  • 只是一个注释 - 您可以使用`$ {user [prop]}`作为速记 (26认同)
  • 最新版本的语法不同,如我在答案中发布的链接所示.我意识到这是一个老问题,但它在谷歌上排名很高. (4认同)
  • 应该是$ {user [prop]} (4认同)

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>
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是不再有效的.get. (5认同)
  • 这种语法有何不同? (2认同)

dde*_*any 41

从2.3.25开始,就像这样:

<#list user as propName, propValue>
  ${propName} = ${propValue}
</#list>
Run Code Online (Sandbox Code Playgroud)

请注意,这也适用于非字符串键(与之不同map[key],必须按此编写map?api.get(key)).

在2.3.25之前,标准解决方案是:

<#list user?keys as prop>
  ${prop} = ${user[prop]}
</#list>
Run Code Online (Sandbox Code Playgroud)

但是,一些非常古老的FreeMarker集成使用了一种奇怪的配置,其中公共Map方法(如getClass)显示为键.发生这种情况的原因是他们正在使用纯属BeansWrapper(而不是DefaultObjectWrapper)simpleMapWrapper属性false.您应该避免这样的设置,因为它将方法与实际Map条目混合在一起.但是,如果你碰上这样倒霉的设置,为了躲避情况的方法是使用公开的Java方法,如user.entrySet(),user.get(key)等,并没有使用模板语言结构,如?keysuser[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>
Run Code Online (Sandbox Code Playgroud)

例如,在Struts2中,BeanWrapper的扩展使用默认的暴露级别以允许这种迭代方式.

  • 这仅在使用`freemarker.ext.beans.BeansWrapper`作为对象包装时才有效.否则`Map`将自动包装到一个不支持`#entrySet()`的`SimpleHash`对象中.(见http://freemarker.sourceforge.net/docs/api/freemarker/template/SimpleHash.html) (4认同)
  • 你真的试过这个吗?因为我在尝试时遇到了"InvalidReferenceException",而`map?keys`工作了. (3认同)