如果找不到变量,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
不存在,然后在稍后的迭代中缺少 a
但 b
存在怎么办...
从 TemplateExceptionHandler
-s 开始,虽然您可以将失败的表达式重新打印为 InvalidReferenceException
,如 out.write("${" + te.getBlamedExpressionString() + "}");
,但它不适用于非平凡的插值.就像 ${a + b}
示例一样,它会打印 ${b}
,静默删除 a +
.
我有同样的问题,并找到了另一种方法来跳过你知道不在你的数据模型中的变量。
此模板应打印 ${b}:
${a}
${r"${b}"}
结果:
name
${b}
不过,我很想看看您的转载功能究竟是什么样子的。可能会更好。
我正在使用 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
不存在,然后在稍后的迭代中缺少 a
但 b
存在怎么办...
从 TemplateExceptionHandler
-s 开始,虽然您可以将失败的表达式重新打印为 InvalidReferenceException
,如 out.write("${" + te.getBlamedExpressionString() + "}");
,但它不适用于非平凡的插值.就像 ${a + b}
示例一样,它会打印 ${b}
,静默删除 a +
.
我有同样的问题,并找到了另一种方法来跳过你知道不在你的数据模型中的变量。
此模板应打印 ${b}:
${a}
${r"${b}"}
结果:
name
${b}
不过,我很想看看您的转载功能究竟是什么样子的。可能会更好。