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

Can FreeMarker keep the original value if variable is not found?

我正在使用 freemarker 2.3.x。预计并非所有变量都已定义。并且需要原样输出。比如模板是

${a}
${b}

数据模型为a=name。那么输出预计为

name
${b}

通过使用TemplateExceptionHandler.IGNORE_HANDLER,输出将不包含${b}

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

有设置或方法吗?

也许解决这个问题最简单的方法是在数据模型级别。只有你不应该手动添加 "b=${b}" 等,相反,你应该使用自定义 TemplateHashModelEx 作为数据模型("root"),它会自动执行。 (这有一个恼人的副作用,即配置级共享变量(如果有的话)将被数据模型根隐藏。)

反正即使在理论上,也很难正确求解。考虑一下,如果您有 ${a + b},其中 a 存在而 b 缺失怎么办。好吧,它可以呈现为 ${123 + b} 然后,但你看到事情变得复杂起来。那么,如果您有 ${a(b)},其中 a 存在但 b 不存在,然后在稍后的迭代中缺少 ab 存在怎么办...

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

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

此模板应打印 ${b}:

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

结果:

name
${b}

不过,我很想看看您的转载功能究竟是什么样子的。可能会更好。