【问题标题】:Freemarker - replace & with &Freemarker - 用 & 替换 &
【发布时间】:2012-11-24 20:50:24
【问题描述】:

如果我在某个字段中有 & 符号(来自 db,无法更改),并且我想通过 freemarker 显示它...但是让显示(来自 freemarker)读取 &,什么是这样做的方法是什么?

重申一下,我不能事先更改值(或者至少,我不想),我希望 freemarker “取消标记” &。

为了重复重复,这是一个与其他 xml 的 lot 一起放置的值。值本身是独立显示的,被标签包围......所以像

<someTag>${wheeeMyValueWithAnAmpersand}<someTag>

因此,我不希望 所有 符号转义,否则 xml 会看起来很有趣......只是插值中的那个。

【问题讨论】:

    标签: freemarker


    【解决方案1】:

    天哪。

    我看到了问题:代码是这样写的:

    <#escape x as x?xml>
    <#import "small.ftl" as my>
    <@my.macro1/>
    </#escape>
    

    我假设 excape 会排除其中的所有调用 - 这当然是文档所暗示的

    http://freemarker.org/docs/ref_directive_escape.html

    <#assign x = "<test>"> m1>
      m1: ${x}
    </#macro>
    <#escape x as x?html>
      <#macro m2>m2: ${x}</#macro>
      ${x}
      <@m1/>
    </#escape>
    ${x}
    <@m2/>      
    

    输出将是:

    &lt;test&gt;
    m1: <test>
    <test>
    m2: &lt;test&gt;
    

    但是,当您 import 文件时,情况似乎并非如此,并且转义...转义!

    解决方案: http://watchitlater.com/blog/2011/10/default-html-escape-using-freemarker/

    上面的链接详细说明了如何解决这个问题。实际上,它归结为加载不同的 FreemakerLoader,它使用转义标记包装所有模板。

    class SomeCoolClass implements TemplateLoader {
        //other functions here
        @Override  
        public Reader getReader(Object templateSource, String encoding) throws IOException {  
            Reader reader = delegate.getReader(templateSource, encoding);  
            try {  
                String templateText = IOUtils.toString(reader);  
                return new StringReader(ESCAPE_PREFIX + templateText + ESCAPE_SUFFIX);  
            } finally {  
                IOUtils.closeQuietly(reader);  
            }  
        }  
    

    这是来自上面链接的sn-p。您使用现有的 templateLoader 创建类,并将所有必需的方法推迟到该类中。

    【讨论】:

    • 参考手册页解释了这一点。 escape 仅适用于 源代码escape 标记之间的表达式。就像有人为您键入 ?html,但仅在 escape 标签之间的行中。如果您考虑一下,如果将其应用于从那里调用的行,它将几乎无用/难以管理。因为,当您编写宏或要包含的模板时,无论从何处调用它,它都应该执行相同的操作。
    【解决方案2】:

    从 FreeMarker 2.3.24 开始,不再需要 TemplateLoader“hack”。有一个名为output_format 的设置,它指定是否需要转义以及需要转义的内容。这可以使用template_configurations 设置在全局和/或每个模板名称模式下进行配置。推荐的方法更简单(来自手册):

    [...] 如果 recognize_standard_file_extensions 设置为 true(即 默认 incompatible_improvements 设置为 2.3.24 或 更高),源名称以“.ftlh”结尾的模板将获得“HTML” 输出格式,带有“.ftlx”的输出格式为“XML”

    【讨论】:

      猜你喜欢
      • 2018-12-26
      • 2013-07-06
      • 1970-01-01
      • 2011-09-18
      • 1970-01-01
      • 2016-11-09
      • 2014-09-29
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多