我正在尝试将Freemarker与jQuery模板结合使用。
两个框架都使用美元符号/大括号来标识替换的表达式(或者在freemarker中调用它们,“插值”),例如, ${person.name}
。
因此,当我在该语法中定义带有表达式的jQuery模板时,Freemarker会尝试解释它们(并失败)。
我尝试了各种转义${
序列以将其传递给Freemarker无效的组合 - \${
,\$\{
,$\{
等。
在美元和卷曲之间插入一个freemarker评论(例如$<#-- -->{expression}
)DOES工作 - 但我正在寻找一个更简洁和优雅的解决方案。
是否有更简单的方法可以让Freemarker模板输出字符序列${
?
答案 0 :(得分:49)
这应该打印$ {person.name}:
${r"${person.name}"}
答案 1 :(得分:21)
对于没有FreeMarker标记的较长部分,请使用<#noparse>...</#noparse>
。
从FreeMarker 2.3.28开始,通过将[=exp]
配置选项设置为{{1},将FreeMarker配置为使用方括号语法(${exp}
)而不是括号语法(interpolation_syntax
) }。
请注意,与标记语法不同,无法在模板内指定插值语法。更改插值语法需要调用 Java API:
square_bracket
然后FreeMarker会将Configuration cfg;
// ...
cfg.setInterpolationSyntax(SQUARE_BRACKET_INTERPOLATION_SYNTAX);
视为静态文本。
不要将插值语法与标记语法混淆,标记语法也可以具有
${exp}
值,但与插值语法无关。
使用FreeMarker-based file PreProcessor(FMPP)时,可以通过square_bracket
或命令行配置设置,例如:
config.fmpp
这将在处理文件之前调用适当的Java API。
另见:
答案 2 :(得分:4)
另一种选择是使用#include和parse = false选项。也就是说,将您的jQuery模板放入单独的包含页面并使用parse = false,以便freemarker不会尝试解析它。
当模板较大且包含双引号时,这将是一个不错的选择。
答案 3 :(得分:3)
如果${
是您唯一的问题,那么您可以使用jQuery Templates插件中的替代语法:{{= person.name}}
也许比逃避它更清洁。
答案 4 :(得分:1)
你试过$$
吗?
我从Freemarker手册中发现,${r"${person.name}"}
会打印${person.name}
而不会尝试渲染它。
也许您还应该看看Freemarker escaping freemarker
答案 5 :(得分:1)
我不得不花一些时间来找出以下情况,以逃避$ {expression}-
<#assign var = r“ $ {expression}”>
<a href="/user/${r"${expression}"}"> Some link </a>
<#assign x =“ something&” + r“ $ {expression}” />
答案 6 :(得分:0)
如果您想使用非原始字符串以便可以转义双引号,撇号等,则可以执行以下操作:
想象一下,你想在一个字符串里面使用字符串$ {Hello} - “我朋友的朋友”。你不能用原始字符串做到这一点。我使用的是:
${"\x0024{Hello}-\"My friend's friend\""}
因为我使用双引号,所以我没有逃过撇号。
答案 7 :(得分:0)
我可以确认
${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>