如何在Freemarker中输出$ {expression}而不解释它?

时间:2011-03-05 23:47:36

标签: el freemarker jquery-templates

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

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

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

我尝试了各种转义${序列以将其传递给Freemarker无效的组合 - \${\$\{$\{等。

在美元和卷曲之间插入一个freemarker评论(例如$<#-- -->{expression})DOES工作 - 但我正在寻找一个更简洁和优雅的解决方案。

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

8 个答案:

答案 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}-

  • 在Freemarker分配中:
  

<#assign var = r“ $ {expression}”>

  • 在html属性中:
  

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

  • 在Freemarker串联中:
  

<#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>