Итак, аналогично тому, как работают JavaExtensions, расширяя класс JavaExtensions, для создания FastTag вам нужно создать класс, расширяющий FastTag.Каждый метод, который вы хотите выполнить как тег, должен соответствовать следующей структуре метода:
public static void _tagName(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine)
Обратите внимание на подчеркивание перед именем тега.
Чтобы понять, как создать реальный тег, проще всего взглянуть на исходный код FastTag и увидеть его в действии.
Вот источник прямо из git hub.https://github.com/playframework/play/blob/master/framework/src/play/templates/FastTags.java
Ниже приведены некоторые из них, которые я скопировал, чтобы я мог объяснить, как это работает.
public static void _verbatim(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
out.println(JavaExtensions.toString(body));
}
Итак, этот первый метод - тег дословно и просто вызывает метод toString для JavaExtensions и передает тело тега.Тело тега будет чем-то между тегами open и close.Итак,
<verbatim>My verbatim</verbatim>
Значение тела будет равно
My verbatim
Второй пример немного сложнее.Это тег, который опирается на родительский тег для функционирования.
public static void _option(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
Object value = args.get("arg");
Object selectedValue = TagContext.parent("select").data.get("selected");
boolean selected = selectedValue != null && value != null && selectedValue.equals(value);
out.print("<option value=\"" + (value == null ? "" : value) + "\" " + (selected ? "selected=\"selected\"" : "") + "" + serialize(args, "selected", "value") + ">");
out.println(JavaExtensions.toString(body));
out.print("</option>");
}
Этот код работает путем вывода тега HTML-опции и устанавливает выбранное значение, проверяя, какое значение выбрано из родительского тега.Первые 3 строки просто получают данные и устанавливают данные, готовые к выводу.Затем последние 3 строки выводят результат тега.
В исходном коде есть еще много примеров с различной степенью сложности, но, надеюсь, это станет хорошей отправной точкой для вас..
Чтобы ваши теги не конфликтовали между проектами или с основными тегами Play, вы можете настроить пространства имен, используя аннотацию уровня класса @ FastTags.Namespace.
Итак, дляПривет тег, в пространстве имен my.tags, вы должны сделать следующее
@FastTags.Namespace("my.tags")
public class MyFastTag extends FastTags {
public static void _hello (Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
...
}
}
, а затем в ваших шаблонах вы бы ссылались на тег приветствия как
#{my.tags.hello/}