官网手册
方法变量在存于实现了TemplateMethodModel
接口的模板中。这个接口包含一个方法:TemplateModel exec(java.util.List arguments)
。当使用方法调用表达式调用方法时,exec
方法将会被调用。形参将会包含FTL方法调用形参的值。exec
方法的返回值给出了FTL方法调用表达式的返回值。
TemplateMethodModelEx
接口扩展了TemplateMethodModel
接口。它没有添加任何新方法。 事实上这个对象实现这个标记接口是给FTL引擎暗示, 形式参数应该直接以TemplateModel
的形式放进java.util.List
。否则将会以String
形式放入list。
注:TemplateMethodModel
接口官方已经不推荐使用,而是推荐使用TemplateMethodModelEx
这个接口。
实现方法
例如:下面这个方法,返回第一个字符串在第二个字符串第一次出现时的索引位置, 如果第二个字符串中不包含第一个字符串,则返回-1:
public class IndexOfMethod implements TemplateMethodModelEx {
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() != 2) {
throw new TemplateModelException("Wrong arguments");
}
return new SimpleNumber(
((String) args.get(1)).indexOf((String) args.get(0)));
}
}
调用方法
Map dataMap = new HashMap();
dataMap.put("indexOf", new IndexOfMethod());
Template template = cfg.getTemplate("a.ftl");
StringWriter out = new StringWriter();
template.process(dataMap, out);
out.flush();
System.out.println(out.getBuffer().toString());
a.ftl文件内容为:${indexOf("met", "something")}
将会输出:2
如果需要访问FTL运行时环境(读/写变量,获取本地化信息等),则可以使用
Environment.getCurrentEnvironment()
来获取。