使用带有 javascript ES6 模板字符串的 freemarker

ada*_*amM 3 javascript template-engine freemarker

Freemaker 模板使用以下语法呈现变量:${name}

Javascript ES6 模板字符串具有类似的语法 ${name}

问题是当freemarker 在服务器上运行时,它会尝试渲染javascript 代码中的模板,因为Freemarker 认为它遇到了一个变量(实际上它是一个应该在客户端渲染的javascript 模板)。关于如何处理的建议?

一种方法是将所有 JS 包装在一个 freemarker 注释中(因此它永远不会被评估),

或者将 JS 代码放在一个单独的文件中(没有内联在 html 页面中),这样它就不会被 freemarker 评估。

ege*_*men 6

你可以在 noparse 标签中使用 javascripts

 <#noparse>...</#noparse>
Run Code Online (Sandbox Code Playgroud)

或者

const name = "WORLD";
Hello ${r"${name}"}
Run Code Online (Sandbox Code Playgroud)

html 视图 "Hello ${name}" 输出-> Hello WORLD


dde*_*any 5

更新:从 FreeMarker 2.3.28 开始,您可以通过将配置设置设置为(在 Java API 中:)来将 FreeMarker 配置为使用[=exp]而不是。然后就是 FreeMarker 的静态文本。不要将此设置与设置混淆,后者也可以有值,但独立于插值语法(但您可能更喜欢将两者都设置为)。另请参阅:https ://freemarker.apache.org/docs/dgui_misc_alternativesyntax.html${exp}interpolation_syntaxsquare_bracketConfiguration cfg; ... cfg.setInterpolationSyntax(Configuration.SQUARE_BRACKET_INTERPOLATION_SYNTAX)${exp}tag_syntaxsquare_bracketsquare_bracket

过时的答案:不幸的是,FreeMarker 的语法不可配置(我认为 ES6 模板语法也不是)。因为这将是真正的解决方案,将其配置为使用其他东西而不是$. 您可以使用自定义实现来创建一个穷人的实现,该自定义TemplateLoader实现仅委托给另一个TemplateLoader,不同之处在于它向其Reader返回的内容添加了一个过滤器,并且它会动态修改模板。它将${-s 替换为$<#-- -->{,将@{-s 替换为${。那么你的原始模板可以是类似的${forES6} @{forFM}。这有很多缺点,例如 FreeMarker 错误位置中的列号会被替换,并且 Eclipse 插件和其他一些工具将无法工作。