有人可以解释如何使用FastTags

时间:2010-11-09 15:43:06

标签: java playframework

使用播放框架创建海关标签有两种方法。

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

    最新版本没有记录。

1 个答案:

答案 0 :(得分:23)

因此,类似于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));
}

因此,第一种方法是 verbatim 标记,只需在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/}