在地图上迭代地图

时间:2018-04-26 08:37:25

标签: freemarker

在java中,我有一个带有hashmap条目的HashMap,名为" CategoriesDocuments"。我可以使用以下语法在freemarker中调用它:

${CategoriesDocuments}

它由Key / value系统组成。这里的值是再次成为TreeMap条目的类别。此类别在其值中包含路径。

基本上我想访问这些路径。

我尝试的是获得这样的第一个值:

<#list CategoriesDocuments?values as v>
 ${v}
</#list>

我有一个错误,告诉v必须是数字或字符串,而不是freemarker.ext.beans.SimpleMethodModel。

当我输入$ {CategoriesDocuments}时,我有:

{E010=[F:\Workspace\uploads\E010108_1216.pdf, F:\Workspace\uploads\E010136.pdf, E051=[F:\Workspace\uploads\E051301_0115.pdf], E090=[F:\Workspace\uploads\E090501_0414.pdf],E230=[F:\Workspace\uploads\E230104_1113.pdf]}

E010例如是类别,之后我们有文件的路径。

如何通过迭代在列表上执行某种列表来访问文件?

非常感谢

1 个答案:

答案 0 :(得分:0)

我想问题在于FreeMarker的-fdata-sections配置设置。一些应用程序,尤其是Struts,使用object_wrapper(不将其BeansWrapper设置更改为simpleMapWrapper),这样做true的Java方法很可怕暴露,并与真正的钥匙混合在一起。就像,Map将返回CategoriesDocuments.get方法本身。因此,这样的地图的get(Object)将包含一些方法,与实际的键混合在一起。如果您无法更改?values(使用默认值object_wrapper,建议使用),因为某些模板与该更改不兼容,请尝试通过利用此方法来解决此问题公开了DefaultObjectWrapper的Java API:Map

此外,FreeMarker实际上无法直接打印类似地图的数据结构。您应该列出它们,然后以您实际需要的格式自己打印键和值。它恰好在你的情况下工作,因为它只调用<#list someMap.values() as value>,但我不会依赖toString()的输出,这几乎只适用于Java中的调试。