2010-11-09 11 views

回答

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行输出标签的结果。

我已经链接到源代码中有更多的例子,不同程度的复杂性,但希望这将是一个很好的起点。

为确保您的标签不会在项目间或核心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/} 
+3

非常好,除此之外,您还可以解释类注释@FastTags。命名空间(“mytags”),这将是防止名称冲突的良好实践。 – niels 2010-11-09 18:08:24

+1

好点,我现在补充说。 – Codemwnci 2010-11-09 18:52:30

+0

谢谢!你能否提供一些细节来提升标签中的错误?说一个输入参数丢失...我如何产生一个错误/异常? – 2010-11-09 21:29:16