列出 Freemarker 模板中的所有变量

Posted

技术标签:

【中文标题】列出 Freemarker 模板中的所有变量【英文标题】:List all variables in a Freemarker template 【发布时间】:2021-10-26 06:54:00 【问题描述】:

我们有一个动态的 Freemarker 模板。我们有 1 个模板,其中包含全局文档结构和带有动态块的不同配置。这些块使用block.content?interpret 评估。

在主模板和块中,我们也有需要填充的变量。我想知道是否可以在结果模板中提取所有变量的列表?

目前,我唯一能想到的就是解析生成的模板并使用正则表达式(或类似的东西)来提取$(...) 之间的任何内容。但也许 Freemarker 中有一个更好的扩展点,我(还)不知道。

我们想要变量列表,以便我们可以与用户交流需要填写哪些变量(我们有一个 UI 可以输入内容,但我们也希望通过服务提供元模型)。

【问题讨论】:

在 SO 和网络上有一些答案(你肯定会找到它们)。但是他们会说这是不支持的,因为语言的动态特性。一般来说,不可能说出使用了哪些变量。除非我们严格限制可以使用的语言结构。 这是我怀疑的,也是从 FreeMarker 的内部推断出来的,只是想确定一下。谢谢,那我们将不得不寻找另一种解决方案。 【参考方案1】:

不要认为您可以(也不想)根据模板自动执行此操作。例如,这里使用了哪些变量?

$lt + [a, b, c, d]?min gt 5 ? lte : f

如果您能够从模板解析属性名称,那么您不知道它是什么类型。

我不知道你的确切用例,但是当你用 Java 标记你的问题时,你可能会在某处做这样的事情:

template.process(model, writer);

如果您为此使用自定义 Java 对象,它们将是生成文档的理想选择。

【讨论】:

关键是它是一个通用的解决方案,模型只不过是一个输入 Map 通过 Web 服务传递给使用。由于事物的通用性,因此并不是真正的花哨的对象结构。 FreeMarker 可能会解析表达式并从模型中即时检索值,而不是事先准备好东西。所以我实际上想要这个,但我怀疑它是可能的(因此这个问题,就像我在源代码和调试会话中的搜索一样,我找不到任何可以帮助解决这个问题的东西)。

以上是关于列出 Freemarker 模板中的所有变量的主要内容,如果未能解决你的问题,请参考以下文章

freemarker如何遍历模板中所有变量

使用 freemarker 为自定义变量格式化 xml 模板

使用 USCavalry 转换器将 Velocity 模板转换为 FreeMarker

Freemarker的使用方法

Freemarker 模板语言中的变量名

Java 使用 freemarker 模板引擎的相关疑问 ,求大神走过路过不要错过