如何在 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 属性中:
在 Freemarker 连接中:
<a href="/user/$r"$expression""> Some link </a>
【讨论】:
【参考方案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 而不会被解释?的主要内容,如果未能解决你的问题,请参考以下文章