freemarker - 在地图中的地图上迭代
问题描述
在 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 是例如类别,然后我们有文件的路径。
如何在列表中创建一种列表以通过迭代访问文件?
多谢
解决方案
我想问题出object_wrapper
在 FreeMarker 的配置设置上。一些应用程序,尤其是 Struts,使用 a BeansWrapper
for 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 中进行调试。
推荐阅读
- xml - 需要根据其中一个 XML 标签更改编码格式
- java - 调用内部带有 for 循环的方法,而不是更新变量
- javascript - Discord Bot 生成错误:“消息未定义”
- c++ - 指向 C++ 中函数的指针,(*pf)() 和 pf 是否相同?
- bash - 了解为什么 git-filter-branch 没有清理我的历史记录
- python - 具有可变和不可变属性的数据类样式对象?
- arrays - React 渲染另一个匹配当前组件的组件
- python - 更新到 tensorflow 2.0:keras 中的时代概念
- ios - 在 iOS 应用程序和框架之间通过内存引用共享数据
- python - 如何通过另一个循环循环字典?