Freemaker模板使用以下语法呈现变量:$ {name}
Javascript ES6模板字符串具有类似的语法$ {name}
问题在于,当freemarker在服务器上运行时,它会尝试在javascript代码中呈现模板,因为Freemarker认为它遇到了一个变量(实际上它是一个javascript模板,应该在客户)。关于如何处理这个问题的推荐?
一种方法是将所有JS包装在freemarker注释中(因此永远不会对其进行评估),
或将JS代码放在一个单独的文件中(不在html页面中内联),以便它永远不会被freemarker评估。
答案 0 :(得分:1)
更新:自FreeMarker 2.3.28起,您可以将[=exp]
配置设置为{{1},将FreeMarker配置为使用${exp}
而不是interpolation_syntax
(在Java API中:square_bracket
)。然后Configuration cfg; ... cfg.setInterpolationSyntax(Configuration.SQUARE_BRACKET_INTERPOLATION_SYNTAX)
只是FreeMarker的静态文本。不要将此设置与${exp}
设置混淆,tag_syntax
设置也可以具有square_bracket
值,但与插值语法无关(但您可能更喜欢将两者都设置为square_bracket
)。另见:https://freemarker.apache.org/docs/dgui_misc_alternativesyntax.html
过时回答:遗憾的是,FreeMarker的语法不可配置(我假设也不是ES6模板语法)。因为那将是真正的解决方案,将其配置为使用其他内容而不是$
。您可以使用自定义TemplateLoader
实施创建一个穷人的实现,该实现仅委托给另一个TemplateLoader
,但它会向其返回的Reader
添加一个过滤器,并随之修改即时模板。它会将${
- s替换为$<#-- -->{
,将@{
- s替换为${
。那么您的原始模板就像${forES6} @{forFM}
。这有一些缺点,比如FreeMarker错误位置中的列号将被取代,Eclipse插件和其他一些工具将无法工作。
答案 1 :(得分:1)
你可以在noparse标签中使用javascripts
<#noparse>...</#noparse>
或
const name = "WORLD";
Hello ${r"${name}"}
html视图“Hello $ {name}”输出 - &gt; Hello WORLD