【问题标题】:Can someone explain how to use FastTags有人可以解释如何使用 FastTags
【发布时间】:2010-11-09 15:43:05
【问题描述】:

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

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

最新的没有记录。

【问题讨论】:

    标签: java playframework


    【解决方案1】:

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

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

    <verbatim>My verbatim</verbatim>
    

    body 值为

    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/}
    

    【讨论】:

    • 非常好,另外你可以解释类注释@FastTags.Namespace("mytags"),这将是防止名称冲突的好习惯。
    • 谢谢!您能否提供有关从标签引发错误的详细信息?说缺少输入参数...如何生成错误/异常?
    • 看看我发布的 github 链接中的第 147 行。它显示了在与您指定的情况类似的情况下使用的模板执行异常示例。
    • 明白了,谢谢,供参考: throw new TemplateExecutionException(template.template, fromLine, "请指定错误键", new TagInternalException("请指定错误键"));
    • 其实上面的异常是有问题的,template.template is not visible is a custom pkg。我开了一张票play.lighthouseapp.com/projects/57987/tickets/…
    猜你喜欢
    • 2011-12-26
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2017-12-14
    • 2012-05-29
    • 2012-05-23
    相关资源
    最近更新 更多