终于想通了答案:
autoEscape
不启用模板中的转义。它只允许转义直接传递到groovyMarkupTemplate
的数据,如下所示:
groovyMarkupTemplate('template.gtpl', var: '<pre>Escaped</pre>')
解决方案
为了在所有模板中默认启用转义,有必要像这样子BaseTemplate
类化:
在 Ratpack.groovy 中应用我们自己的模板处理器
bindings {
module(MarkupTemplateModule) { TemplateConfiguration config ->
config.baseTemplateClass = MyMarkupTemplate
}
}
子类 BaseTemplate 并覆盖 methodMissing():
@InheritConstructors
abstract class MyMarkupTemplate extends BaseTemplate {
@Override
Object methodMissing(String tagName, Object args) {
if (args instanceof Object[]) {
Object[] argsArray = (Object[])args
// Traverse argsArray ans escape every instance of String
// with XmlUtil.escapeXml()
return super.methodMissing(tagName, argsArray)
}
super.methodMissing(tagName, args)
}
}