首页 > 解决方案 > 在地图中的地图上迭代

问题描述

在 java 中,我有一个带有名为“CategoriesDocuments”的哈希图条目的 HashMap。我可以使用以下语法在 freemarker 前面调用它:

${CategoriesDocuments}

它由键/值系统组成。这里的值是再次作为 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 是例如类别,然后我们有文件的路径。

如何在列表中创建一种列表以通过迭代访问文件?

多谢

标签: freemarker

解决方案


我想问题出object_wrapper在 FreeMarker 的配置设置上。一些应用程序,尤其是 Struts,使用 a BeansWrapperfor that(不将其simpleMapWrapper设置更改为),这会在暴露 Java 方法并与真正的键混合在一起的情况true下做这件可怕的事情。Map就像,CategoriesDocuments.get将返回get(Object)方法本身。因此,?values这样的映射将包含一些方法,与实际的键混合。如果您无法更改object_wrapper(建议使用默认值 , DefaultObjectWrapper),因为某些模板与该更改不兼容,请尝试通过Map暴露 Java API 来解决此问题:<#list someMap.values() as value>

此外,FreeMarker 实际上不能直接打印类似地图的数据结构。您应该列出它们,然后以您实际需要的格式自己打印键和值。它恰好在您的情况下工作,因为它只是调用toString(),但我不会依赖 的输出toString(),这几乎仅用于在 Java 中进行调试。


推荐阅读