我想知道,是否有办法用一些规则预处理freemarker模板 - 我想添加一些语法糖,这不是指令,也不是方法。
Fo实例我有变量,我这样打印:
${item.getLocale(currentLocale).name}
${item.getLocale(currentLocale).text}
${item.parent.getLocale(currentLocale).name}
${item.parent.getLocale(currentLocale).text}
显然,getLocale
结构使得整个表达式非常难看。我想要实现的是能够写:
${item.l.name}
${item.l.text}
${item.parent.l.name}
${item.parent.l.text}
这样编译过程中所有.l.
都会被重写为.getLocale(currentLocale)
。
有一些不错的方法吗?谢谢!
答案 0 :(得分:1)
这就是为什么FreeMarker中存在对象包装的原因;您可以以自定义方式将数据呈现给模板。我想item
属于特定的Java类。因此,您可以扩展DefaultObjectWrapper
或BeansWrapper
以专门包装这些项目,然后在初始化FreeMarker时使用Configuration.setObjectWrapper(new YourObjectWrapper())
。 (请参阅DefaultObjectWrapper
的源代码作为自定义的示例;它特别扩展BeansWrapper
以包装XML节点,Jython对象等。)因此,当您在模板中有${item.name}
时,这是对Java端YourHashModel.get("name")
的调用(YourHashModel
扩展freemarker.template.TemplateHashModel
),而get
方法可以return new SimpleScalar(item.getLocale(currentLocale).get("name"))
或类似。< / p>