Freemarker - 用 & 替换 &

Posted

技术标签:

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

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

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

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

<someTag>$wheeeMyValueWithAnAmpersand<someTag>

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

【问题讨论】:

【参考方案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”

【讨论】:

以上是关于Freemarker - 用 & 替换 &的主要内容,如果未能解决你的问题,请参考以下文章

Java导出word文档之freemarker导出

java利用freemarker导出world

java用freemarker导出数据到word(含多图片)

使用freemarker模板引擎生成word文档的开发步骤

FreeMarker ? 替换多个值

freemarker输出图片或文字到word