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/>
输出将是:
<test>
m1: <test>
<test>
m2: <test>
但是,当您 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 - 用 & 替换 &的主要内容,如果未能解决你的问题,请参考以下文章