如果找不到变量,FreeMarker可以保留原始值吗?

时间:2017-04-21 06:29:14

标签: freemarker

我正在使用freemarker 2.3.x.预计并非所有变量都被定义。它需要按原样输出。例如,模板是

${a}
${b}

数据模型为a=name。然后输出预计

name
${b}

使用TemplateExceptionHandler.IGNORE_HANDLER,输出不会包含${b}

现在我要向数据模型添加一个新条目b=${b}。它有效,但它是一种丑陋的解决方法。而且我需要确切地知道有多少未定义的变量存在限制。

有设置或方法吗?

2 个答案:

答案 0 :(得分:2)

我有同样的问题,并找到了另一种方法来跳过你知道不在你的数据模型中的变量。

此模板应打印$ {b}:

${a}
${r"${b}"}

结果:

name
${b}

https://stackoverflow.com/a/5207658/2618186

我很想看看你的重印功能究竟是怎样的。可能更好。

答案 1 :(得分:1)

解决这个问题的最不可思议的方法可能是在数据模型层面。只有你不应该添加" b = $ {b}"而这样,您应该使用自定义TemplateHashModelEx作为数据模型(" root"),它会自动执行此操作。 (这有一个恼人的副作用,即配置级共享变量,如果有的话,将被数据模型根隐藏。)

无论如何,即使在理论上,也无法正确解决。考虑一下,如果${a + b}存在a并且b丢失,该怎么办?那么,它可以呈现为${123 + b}然后,但你会看到事情变得复杂。广告然后,如果您有${a(b)},其中a存在但不是b,然后在稍后的迭代a中丢失但b存在,该怎么办? ...

TemplateExceptionHandler开始,虽然您可以将失败的表达式重新打印为InvalidReferenceException,而out.write("${" + te.getBlamedExpressionString() + "}");,但它不能用于非平凡的插值。与${a + b}示例一样,它会打印${b},默默删除a +