35

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

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

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

我尝试了各种转义${序列的组合以将其通过 Freemarker 无济于事 - \${, \$\{,$\{等。

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

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

4

8 回答 8

66

这应该打印 ${person.name}:

${r"${person.name}"}

来自freemarker 文档

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

于 2011-03-05T23:58:42.267 回答
25

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

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

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

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

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

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

使用基于 FreeMarker 的文件预处理器(FMPP) 时,可以通过config.fmpp命令行或在命令行上配置设置,例如:

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

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

也可以看看:

于 2011-08-05T07:54:29.350 回答
4

另一种选择是将#include 与 parse=false 选项一起使用。也就是说,将您的 jQuery 模板放入单独的包含页面并使用 parse=false 以便 freemarker 不会尝试解析它。

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

于 2011-08-01T12:23:08.173 回答
3

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

也许比逃避它更干净一些。

于 2011-03-06T02:03:45.130 回答
3

我不得不花一些时间来弄清楚以下场景来逃避 ${expression} -

  • 在 Freemarker 作业中:

<#assign var = r"${表达式}">

  • 在 html 属性中:

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

  • 在 Freemarker 连接中:

<#assign x = "something&"+r"${表达式}"/>

于 2018-12-14T18:18:18.733 回答
2

你试过了$$吗?

我从 Freemarker 手册中发现,它会在不尝试渲染的情况下${r"${person.name}"}打印出来。${person.name}

也许您还应该看看Freemarker escaping freemarker

于 2011-03-05T23:56:47.203 回答
1

我可以确认

${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>
于 2015-11-03T09:52:31.133 回答
0

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

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

${"\x0024{Hello}-\"My friend's friend\""}

自从我使用双引号以来,我没有逃脱撇号。

于 2014-01-15T19:49:33.870 回答