Rambler's Top100
Программные продукты
HelloWorld в FreeMarker
Время - деньги!

Time is money!

  Rambler's Top100


Создание методов в 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 классами.

Открытые коды