Time
is money!



Создание методов в Freemarker
С.Зубарев
При работе
с шаблонами рано или поздно появляется ситуации, когда встроенные методы не
могут решить поставленные задачи. В этом случае необходимо создавать собственные.
Например, в процессе создания текста из шаблона нужно посчитать cos(x).
Для этого создадим отдельный java класс MyCustomMethod, имплементирующий интерфейс freemarker.template.TemplateMethodModel и в методе exec() сделаем необходимое преобразование.
import java.util.List;
import freemarker.template.SimpleNumber;
import freemarker.template.TemplateModelException;
public class MyCustomMethod
implements freemarker.template.TemplateMethodModel{
@Override
/*этот единственный метод поставляется в интерфейсе TemplateMethodModel*/
/*в параметр args передаются в виде списка все аргументы метода*/
public Object exec(List args) throws TemplateModelException {
//считаем, что аргумент только один и делаем проверку
if (args.size() != 1) {
throw new TemplateModelException("Wrong arguments");
}
//получаем значение, от которого надо вычислить cos
Double d = Double.parseDouble(args.get(0).toString());
//возвращаем результат в виде объекта freemarker
return new SimpleNumber(Math.cos(d));
}
}
Создадим шаблон cm.ftl следующего содержания:
<#assign x = 1>
Переменная х = ${x}
Cos(x) = ${CountCos(x)}
Создадим программу, которая использует этот шаблон:
import java.io.File;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class MyCustomMethodTest {
public static void
main(String[] args) throws Exception{
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("bin/"));
HashMap root = new HashMap();
/*добавляем наш метод в конфигурацию под названием CountCos*/
root.put("CountCos", new MyCustomMethod());
Template temp = cfg.getTemplate("cm.ftl");
Writer f0 = new OutputStreamWriter(System.out);
temp.process(root, f0);
f0.flush();
}
}
Если запустить эту программу, то на выходе мы получим
Переменная х = 1
Cos(x) = 0.54
Изменяя переменную x в шаблоне мы получим значение cos(x) без перекомпиляции программы.
Следует заметить, что
количество параметров у методов, созданных таким способом может быть любым,причем
значение параметров не обязательно должно быть статично задано в шаблоне:
оно может быть вычислено в процессе обработки шаблона.
Тело метода – код Java, и это дает широкие возможности для создания собственных
преобразований и взаимодействий с другими java классами.