如何在 Freemarker 中输出 $expression 而不会被解释?

Posted

技术标签:

【中文标题】如何在 Freemarker 中输出 $expression 而不会被解释?【英文标题】:How to output $expression in Freemarker without it being interpreted?如何在 Freemarker 中输出 $expression 而不会被解释? 【发布时间】:2011-07-09 14:53:54 【问题描述】:

我正在尝试将 Freemarker 与 jQuery 模板结合使用。

两个框架都使用美元符号/大括号来识别替换表达式(或者在 freemarker 中称为“插值”),例如$person.name

因此,当我使用该语法中的表达式定义 jQuery 模板时,Freemarker 会尝试解释它们(但失败了)。

我尝试了各种转义 $ 序列的组合以将其传递给 Freemarker,但无济于事 - \$\$\$\ 等。

在美元和卷曲之间插入 freemarker 注释(例如 $<#-- -->expression)确实有效 - 但我正在寻找更简洁和优雅的解决方案。

有没有更简单的方法让 Freemarker 模板输出字符序列$

【问题讨论】:

【参考方案1】:

这应该打印 $person.name:

$r"$person.name"

来自freemarker docs

一种特殊的字符串文字是原始字符串文字。在原始字符串文字中,反斜杠和 $ 没有特殊含义,它们被视为纯字符。要指示字符串文字是原始字符串文字,您必须在左引号或撇号-引号之前直接放一个 r

【讨论】:

【参考方案2】:

对于没有 FreeMarker 标记的较长部分,请使用 <#noparse>...</#noparse>

从 FreeMarker 2.3.28 开始,通过将 interpolation_syntax 配置选项设置为 square_bracket,将 FreeMarker 配置为使用方括号语法 ([=exp]) 而不是大括号语法 ($exp)。

请注意,与标记语法不同,插值语法不能在模板内指定。更改插值语法需要调用 Java API:

Configuration cfg;
// ...
cfg.setInterpolationSyntax(SQUARE_BRACKET_INTERPOLATION_SYNTAX);

然后 FreeMarker 会认为 $exp 是静态文本。

不要将插值语法与标签语法混淆,标签语法也可以有square_bracket值,但与插值语法无关。

使用FreeMarker-based file PreProcessor (FMPP) 时,可以通过config.fmpp 或命令行配置设置,例如:

fmpp --verbose --interpolation-syntax squareBracket ...

这将在处理文件之前调用适当的 Java API。

另见:

https://freemarker.apache.org/docs/dgui_misc_alternativesyntax.html http://fmpp.sourceforge.net/settings.html#templateSyntax

【讨论】:

【参考方案3】:

我不得不花一些时间找出以下场景来逃避 $expression -

在 Freemarker 分配中:

在 html 属性中:

<a href="/user/$r"$expression""> Some link </a>

在 Freemarker 连接中:

【讨论】:

【参考方案4】:

我可以确认

$r"$item.id"

以正确的方式为例。

所以我有点完整的例子看起来像

<span><a href="/user/user-remove/$r"$item.id""> Remove </a></span>

输出将是:

<span><a href="/user/user-remove/$item.id"> Remove </a></span>

【讨论】:

【参考方案5】:

如果您想使用非原始字符串来转义双引号、撇号等,您可以执行以下操作:

假设您想在字符串中使用字符串 $Hello-"My friend's friend"。你不能用原始字符串做到这一点。我使用的有效方法是:

$"\x0024Hello-\"My friend's friend\""

自从我使用双引号以来,我没有转义撇号。

【讨论】:

【参考方案6】:

另一个选项是使用带有 parse=false 选项的#include。也就是说,将您的 jQuery 模板放入单独的包含页面并使用 parse=false,这样 freemarker 就不会尝试解析它。

当模板较大且包含双引号时,这将是一个不错的选择。

【讨论】:

【参考方案7】:

如果 $ 是您唯一的问题,那么您可以使用 jQuery 模板插件中的替代语法,如下所示:= person.name

也许比逃跑要干净一点。

【讨论】:

绝对干净。感谢您的提示!【参考方案8】:

你试过$$吗?

我从 Freemarker 手册中发现 $r"$person.name" 将打印出 $person.name 而不会尝试渲染它。

或许你也应该看看Freemarker escaping freemarker

【讨论】:

以上是关于如何在 Freemarker 中输出 $expression 而不会被解释?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Freemarker 中输出 $expression 而不会被解释?

如何在freemarker中输出json文档的整个节点

如何使用 Freemarker 模板输出 JSON

如何在 Freemarker 列表之间获取逗号

freemarker整理

maven中使用freemarker,如何配置需要哪些配置文件