【问题标题】:Lazy evaluation of variables/interpolations for Pebble/FreemarkerPebble/Freemarker 的变量/插值的惰性评估
【发布时间】:2016-07-08 10:05:13
【问题描述】:

假设我在 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 等。

在执行模板之前,这两个引擎中的任何一个/两个引擎中是否有一种方法可以获取所需变量的列表?一种对每个属性值进行惰性求值的方法

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

【问题讨论】:

  • 您是在问您的模型是否可以对属性值进行惰性求值?

标签: java freemarker pebble


【解决方案1】:

您使用 Freemarker 生成的每种文档都有自己的模板。每个模板都会有一组它使用的变量。在您的 Java 代码中,您提供了将变量名称映射到值的 Map。如果每个模板对应不同的 Java 方法,这些方法可以为该模板设置所需的最小映射。该地图不必是HashMap;理论上,您可以编写自己的 Map 接口实现,该接口在其 getvalues (等)方法中进行惰性求值。但这几乎可以肯定是麻烦多于其价值。您提供的 map 中的值不必是 String 对象; Freemarker 会使用每个对象的toString 方法,它提供了一种惰性求值。

【讨论】:

  • 在这种情况下,我不会提前知道模板是什么样子的,而且对于每个用户来说,它们很可能是不同的。模板中的变量将是用户定义的,所以无论如何我都需要查找它们。如果需要,我可以覆盖 HashMap - 但我希望有一种方法可以预先评估模板以获取变量列表。
  • 这毫无意义。如果模板是用户定义的,则用户正在对系统进行编程,而不是您。你不想那样做。
  • 该软件为用户提供了大量的可定制性。这个想法是他们可以编写自己的模板,我们将在我们的系统中填充数据。他们使用的变量将在系统的其他地方定义。这是我们非常想做的事情。
  • 这是一篇有趣的文章。但是维基百科文章指出,在所有情况下都没有错。不过,如果您能提出更好的解决方案,我会考虑的。使用模板引擎的目标是允许我们的用户创建输出文件。主要是 xml,但也可能是其他格式。我们的每个用户都需要多种输出,多种格式通常是客户独有的。所以他们会编写自己的模板来反映这一点。我们让他们使用自己的变量,这样他们就不需要深入了解我们的 java 结构来使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多