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

StackOverflow https://stackoverflow.com/questions/4135529

  •  30-09-2019
  •  | 
  •  

Вопрос

Есть два способа создания таможенных тегов с помощью Play Framework.

  1. Определяя отличный шаблон в App/View/Tags
  2. Прямо в чистой Java, проведя класс, расширяя FastTags

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

Это было полезно?

Решение

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

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));
}

Итак, этот первый метод - дословно Tag и просто вызывает метод ToString на Javaextensions и проходит в тело тега. Тело тега было бы чем угодно между открытым и близким тегом. Так

<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 строки выводят результат тега.

В исходном коде есть еще много примеров, с которыми я связал, с различной степенью сложности, но, надеюсь, это будет хорошей отправной точкой для вас.

Чтобы убедиться, что ваши теги не конфликтуют между проектами или с основными тегами воспроизведения, вы можете настроить пространства имен, используя аннотацию уровня класса @fasttags.namespace.

Итак, для тега Hello, в пространстве имен моего.tags, вы бы сделали следующее

@FastTags.Namespace("my.tags") 
public class MyFastTag extends FastTags {
    public static void _hello (Map<?, ?> args, Closure body, PrintWriter out, ExecutableTemplate template, int fromLine) {
        ...
    }
}

А потом в ваших шаблонах вы будете ссылаться на тег Hello как

#{my.tags.hello/}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top