方法变量在存于实现了 TemplateMethodModel
接口的模板中。这个接口包含一个方法:
TemplateModel exec(java.util.List arguments)
。
当使用 方法调用表达式
调用方法时,exec
方法将会被调用。
形参将会包含FTL方法调用形参的值。exec
方法的返回值给出了FTL方法调用表达式的返回值。
TemplateMethodModelEx
接口扩展了
TemplateMethodModel
接口。它没有添加任何新方法。
事实上这个对象实现这个 标记 接口是给FTL引擎暗示,
形式参数应该直接以 TemplateModel
的形式放进
java.util.List
。否则将会以
String
形式放入list。
出于这些很明显的原因,这些接口没有默认的实现。
例如:下面这个方法,返回第一个字符串在第二个字符串第一次出现时的索引位置, 如果第二个字符串中不包含第一个字符串,则返回-1:
public class IndexOfMethod implements TemplateMethodModel { 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))); } }
如果将一个实例放入根数据模型中,像这样:
root.put("indexOf", new IndexOfMethod());
那么就可以在模板中调用:
<#assign x = "something"> ${indexOf("met", x)} ${indexOf("foo", x)}
将会输出:
2 -1
如果需要访问FTL运行时环境(读/写变量,获取本地化信息等),则可以使用
Environment.getCurrentEnvironment()
来获取。