25

有两种方法可以使用 play 框架创建自定义标签。

  1. 通过在 app/view/tags 中定义一个 groovy 模板
  2. 通过类扩展 FastTags 直接在纯 java 中

最新的没有记录。

4

1 回答 1

23

因此,类似于 JavaExtensions 通过扩展 JavaExtensions 类的工作方式,要创建 FastTag,您需要创建一个扩展 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));
}

所以,第一个方法是逐字标记,简单地调用 JavaExtensions 上的 toString 方法,并传入标记的主体。标签的主体可以是打开和关闭标签之间的任何内容。所以

<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) {
        ...
    }
}

然后在您的模板中,您将引用 hello 标记为

#{my.tags.hello/}
于 2010-11-09T17:54:27.333 回答