【问题标题】: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 模板输出字符序列${

【问题讨论】:

    标签: el freemarker jquery-templates


    【解决方案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。

      另见:

      【讨论】:

        【解决方案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"。你不能用原始字符串做到这一点。我使用的有效方法是:

            ${"\x0024{Hello}-\"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

                【讨论】:

                  猜你喜欢
                  • 2014-05-19
                  • 1970-01-01
                  • 2019-06-18
                  • 2015-11-11
                  • 2016-08-18
                  • 2011-09-14
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多