使用 FreeMarker 获取大对象
Getting big objects with FreeMarker
我认为如果模板设计者能够从给定对象访问他想要的所有字段,那就太好了。所以在 java 而不是:
Map<String, Object> fields = new HashMap<>();
fields.add("x", unit.getX());
fields.add("y", unit.getY());
fields.add("z", unit.getZ());
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("unit", fields);
我可以做到:
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("unit", unit);
并且 ftl 设计器有可能以某种方式访问单元的 x、y 和 z。
所以我有两个问题:
1、如何访问ftl文件中Unit
对象的字段?
2. ftl designer怎么知道,他可以使用哪些可能的字段?
到目前为止,我已经提出了要使用反射的第 1 点。单元 class 正在实现 TemplateHashModel
,在 get(String)
中,我让它按名称查找字段,然后将值解析为 SimpleScalar
、SimpleNumber
或其他 TemplateHashModel
.这是一个好的解决方案吗?
关于问题1,默认情况下是这样的。您只需执行 dataModel.put("unit", unit)
,其中 unit
是一个 Unit
对象,并且从模板 unit.x
等应该可以工作。如果不是,那么可能 Unit
或 getter 方法不是 public,或者您正在使用一些非默认的限制性 object_wrapper
配置设置。 (或者,问题可能是 Unit
实现了 Map
或 List
或 FreeMarker 特别处理的其他接口。)
关于问题2,数据模型内容是模板(MVC View)和系统其他部分之间的契约,所以理想情况下,它必须由你记录在某个地方。自动生成此类文档超出了 FreeMarker 的范围,因为模板的数据模型内容可能会根据各种条件而变化,因此通常无法自动发现。但是,在某些应用程序中,可以从变量的 Java classes(如 Unit
)生成信息。至于存在哪些顶级变量 ("unit") 以及它们的 class 是什么,数据模型本身可以是模板特定 class 的 Java 对象,而不是 Map
,因此整个数据模型由 Java classes.
指定
我认为如果模板设计者能够从给定对象访问他想要的所有字段,那就太好了。所以在 java 而不是:
Map<String, Object> fields = new HashMap<>();
fields.add("x", unit.getX());
fields.add("y", unit.getY());
fields.add("z", unit.getZ());
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("unit", fields);
我可以做到:
Map<String, Object> dataModel = new HashMap<>();
dataModel.put("unit", unit);
并且 ftl 设计器有可能以某种方式访问单元的 x、y 和 z。
所以我有两个问题:
1、如何访问ftl文件中Unit
对象的字段?
2. ftl designer怎么知道,他可以使用哪些可能的字段?
到目前为止,我已经提出了要使用反射的第 1 点。单元 class 正在实现 TemplateHashModel
,在 get(String)
中,我让它按名称查找字段,然后将值解析为 SimpleScalar
、SimpleNumber
或其他 TemplateHashModel
.这是一个好的解决方案吗?
关于问题1,默认情况下是这样的。您只需执行 dataModel.put("unit", unit)
,其中 unit
是一个 Unit
对象,并且从模板 unit.x
等应该可以工作。如果不是,那么可能 Unit
或 getter 方法不是 public,或者您正在使用一些非默认的限制性 object_wrapper
配置设置。 (或者,问题可能是 Unit
实现了 Map
或 List
或 FreeMarker 特别处理的其他接口。)
关于问题2,数据模型内容是模板(MVC View)和系统其他部分之间的契约,所以理想情况下,它必须由你记录在某个地方。自动生成此类文档超出了 FreeMarker 的范围,因为模板的数据模型内容可能会根据各种条件而变化,因此通常无法自动发现。但是,在某些应用程序中,可以从变量的 Java classes(如 Unit
)生成信息。至于存在哪些顶级变量 ("unit") 以及它们的 class 是什么,数据模型本身可以是模板特定 class 的 Java 对象,而不是 Map
,因此整个数据模型由 Java classes.