Method variables exposed to a template implement the
TemplateMethodModel
interface. This contains one
method: TemplateModel exec(java.util.List
arguments)
. When you call a method with a method call expression,
then the exec
method will be called. The arguments
parameter will contain the values of the FTL method call arguments.
The return value of exec
gives the value of the FTL
method call expression.
The TemplateMethodModelEx
interface extends
TemplateMethodModel
. It does not add any new
methods. The fact that the object implements this
marker interface indicates to the FTL engine that
the arguments should be put to the java.util.List
directly as TemplateModel
-s. Otherwise they will be
put to the list as String
-s.
For obvious reasons there is no default implementation for these interfaces.
Example: This is a method, which returns the index within the second string of the first occurrence of the first string, or -1 if the second string doesn't contains the first.
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))); } }
If you put an instance of this, say, into the root:
root.put("indexOf", new IndexOfMethod());
then you can call it in the template:
<#assign x = "something"> ${indexOf("met", x)} ${indexOf("foo", x)}
and then the output will be:
2 -1
If you need to access the runtime FTL environment (read/write
variables, get the current locale, etc.), you can get it with
Environment.getCurrentEnvironment()
.