Java Pebble/Freemarker变量/插值的延迟计算

Java Pebble/Freemarker变量/插值的延迟计算,java,freemarker,pebble,Java,Freemarker,Pebble,假设我在pebble或freemarker(我正在考虑使用的两个引擎)中有一个模板。它可能看起来像这样: <Node> <Element attribute="{{ VAR_A }}"/> <Element attribute="{{ VAR_F }}"/> <Element attribute="{{ VAR_N }}"/> </Node> 在我的Java代码中,我需要提供一个包含这些变量的对象,我相信它

假设我在pebble或freemarker(我正在考虑使用的两个引擎)中有一个模板。它可能看起来像这样:

<Node>
    <Element attribute="{{ VAR_A }}"/>
    <Element attribute="{{ VAR_F }}"/>
    <Element attribute="{{ VAR_N }}"/>
</Node>

在我的Java代码中,我需要提供一个包含这些变量的对象,我相信它可以是两个引擎中变量名到对象的映射

但是,要生成数据模型,我需要知道要为哪些变量计算值。我有很多数据。我不想计算所有的VAR_A、VAR_B、VAR_C、VAR_D、VAR_E等等,如果它们不被使用的话

在执行模板之前,这两个引擎中的任何一个都有办法获得所需变量的列表吗?一种对每个属性值进行惰性计算的方法


编辑:我不知道当我必须对模板进行评估时,模板会是什么样子,因为它将由用户定义。甚至他们提供的变量都是用户定义的字符串-这就是为什么我需要在提供数据之前获取(并分析)它们。

使用Freemarker生成的每种文档都有自己的模板。每个模板都有一组它使用的变量。在Java代码中,您提供了一个将变量名映射到值的
Map
。如果每个模板对应不同的Java方法,那么这些方法可以为该模板设置所需的最小映射。该映射不必是
HashMap
;理论上,您可以编写自己的
Map
接口实现,该接口在
get
values
(etc)方法中进行惰性评估。但这几乎肯定比它的价值更麻烦。您提供的映射中的值不必是
字符串
对象;Freemarker将使用每个对象的
toString
方法,这提供了一种惰性计算

使用Freemarker生成的每种文档都有自己的模板。每个模板都有一组它使用的变量。在Java代码中,您提供了一个将变量名映射到值的
Map
。如果每个模板对应不同的Java方法,那么这些方法可以为该模板设置所需的最小映射。该映射不必是
HashMap
;理论上,您可以编写自己的
Map
接口实现,该接口在
get
values
(etc)方法中进行惰性评估。但这几乎肯定比它的价值更麻烦。您提供的映射中的值不必是
字符串
对象;Freemarker将使用每个对象的
toString
方法,这提供了一种惰性计算

你是在问你的模型是否可以对属性值进行惰性评估?你是在问你的模型是否可以对属性值进行惰性评估?在这种情况下,我事先不知道模板是什么样子,而且每个用户的模板可能都不一样。模板中的变量是用户定义的,因此我需要查找每个变量。如果需要的话,我可以重写HashMap,但我希望有一种方法可以预先计算模板以获得变量列表。这没有意义。如果tempkates是用户定义的,则用户正在对系统进行编程,而不是您。您不想这样做。该软件为用户提供了大量的可定制性。他们可以编写自己的模板,我们将在系统中填充数据。他们使用的变量将在系统的其他地方定义。这正是我们想要做的。@AdamBourke这是一篇有趣的文章。但维基百科的文章指出,并非所有情况下都是错的。不过,如果你能提出更好的解决方案,我会考虑的。使用模板引擎的目标是允许用户创建输出文件。主要是xml格式,但也可能是其他格式。我们的每个用户都需要多种输出,多种格式往往是客户独有的。因此,他们将编写自己的模板来反映这一点。我们让他们使用自己的变量,这样他们就不需要熟悉我们的java结构就可以使用它。在这种情况下,我事先不知道模板是什么样子,而且每个用户的模板可能都不一样。模板中的变量是用户定义的,因此我需要查找每个变量。如果需要的话,我可以重写HashMap,但我希望有一种方法可以预先计算模板以获得变量列表。这没有意义。如果tempkates是用户定义的,则用户正在对系统进行编程,而不是您。您不想这样做。该软件为用户提供了大量的可定制性。他们可以编写自己的模板,我们将在系统中填充数据。他们使用的变量将在系统的其他地方定义。这正是我们想要做的。@AdamBourke这是一篇有趣的文章。但维基百科的文章指出,并非所有情况下都是错的。不过,如果你能提出更好的解决方案,我会考虑的。使用模板引擎的目标是允许用户创建输出文件。主要是xml格式,但也可能是其他格式。我们的每个用户都需要多种输出,多种格式往往是客户独有的。因此,他们将编写自己的模板来反映这一点。我们让他们使用自己的变量,这样他们就不需要熟悉java结构就可以使用它。