Freemarker迭代hashmap键

Freemarker有两个集合数据types,列表和hashmaps是否有一种方法来迭代hashmap键,就像我们用列表一样?

所以,如果我有一个数据variables让我们说:

user : { name : "user" email : "looser@everything.com" homepage : "http://nosuchpage.org" } 

我想打印所有用户的属性与他们的价值。 这是无效的,但目标是明确的:

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

编辑:不要使用这个解决scheme,特别是不.get(prop) 。 查看其他答案。

你使用内置的键function,例如这应该工作:

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

请注意,这也适用于非string键(与map[key] ,后者必须写为map?api.get(key) )。

在2.3.25之前,标准解决scheme是:

 <#list user?keys as prop> ${prop} = ${user[prop]} </#list> 

然而,一些非常古老的FreeMarker集成使用了一个奇怪的configuration,公共Map方法(如getClass )显示为键。 这发生在他们正在使用纯的BeansWrapper (而不是DefaultObjectWrapper ),其simpleMapWrapper属性保持为false 。 您应该避免这样的设置,因为它将方法与实际的Map条目混合在一起。 但是如果遇到这种不幸的设置,逃避这种情况的方法是使用暴露的Java方法,比如user.entrySet()user.get(key)等,而不是像模板语言结构那样使用?keysuser[key]

如果使用暴露级别为Expose.SAFE或Expose.ALL的BeansWrapper,则可以使用迭代入口集合的标准Java方法:

例如,以下将在Freemarker中工作(至less从版本2.3.19开始):

 <#list map.entrySet() as entry> <input type="hidden" name="${entry.key}" value="${entry.value}" /> </#list> 

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

迭代对象

如果你的map键是一个对象而不是一个string,你可以使用Freemarker来迭代它。

1)将地图转换为控制器中的列表:

 List<Map.Entry<myObjectKey, myObjectValue>> convertedMap = new ArrayList(originalMap.entrySet()); 

2)在Freemarker模板中迭代映射,访问Value和Object中的Key和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['firstname']} ${hash['lastname']} 

输出:

 a b