我正在使用freemarker 2.3.x.预计并非所有变量都被定义。它需要按原样输出。例如,模板是
${a}
${b}
数据模型为a=name
。然后输出预计
name
${b}
使用TemplateExceptionHandler.IGNORE_HANDLER
,输出不会包含${b}
现在我要向数据模型添加一个新条目b=${b}
。它有效,但它是一种丑陋的解决方法。而且我需要确切地知道有多少未定义的变量存在限制。
有设置或方法吗?
答案 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 +
。