Подтвердить что ты не робот

Может кто-нибудь объяснить, как использовать FastTags

Существует два способа создания таможенных тегов с рамкой воспроизведения.

  • Определив шаблон groovy в приложении/представлении/тегах
  • Непосредственно в чистой java путем расширения класса FastTags

Последний НЕ документирован.

4b9b3361

Ответ 1

Итак, подобно тому, как работают JavaExtensions, расширяя класс JavaExtensions, для создания FastTag вам нужно создать класс, расширяющий FastTags. Каждый метод, который вы хотите выполнить как тег, должен соответствовать следующей структуре методов.

public static void _tagName(Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine)

Обратите внимание на подчеркивание перед именем тега.

Чтобы понять, как создать фактический тег, самый простой способ - посмотреть исходный код FastTag и увидеть его в действии.

Вот источник прямо из концентратора git. 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));
}

Итак, этот первый метод является тегом verbatim и просто вызывает метод 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.

Итак, для тега hello в пространстве имен 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/}