Methods - FreeMarker Manual

- Home
- Manual
- Java API

- Contribute
- Report a Bug
- Download

Manual
Previous Next

# Methods

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()`.

Previous Next