当前位置: 首页 > 面试题库 >

有人可以解释如何使用FastTags

锺离飞尘
2023-03-14
问题内容

有两种通过play框架创建海关标签的方法。

  1. 通过在app / view / tags中定义一个Groovy模板
  2. 通过在类中直接扩展FastTag直接在纯Java中

没有最新的文件。


问题答案:

因此,类似于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设置名称空间。

因此,对于问候标签,在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/}


 类似资料:
  • 问题内容: 越来越多地使用Python,并且不断看到在不同文件中设置的变量。有人可以解释这是什么吗? 问题答案: 这是该模块的公共对象的列表,由解释import 。它覆盖了默认的内容,即隐藏以下划线开头的所有内容。

  • 问题内容: 当我将字符串值1和7存储到“ mykey”中时, redis中到底存储了 什么?以及getbit在redis中如何工作? 有人试图在该值内循环位吗? 我知道bitcount会给我2,但我也想从中获得确切的字符串值1和7,这可能吗? -- 我通过使用erlang redis客户端读取输出进行了一些实验。 erlang输出: 然后删除此条目: 我做同样的事情来偏移2 4 8,在这里您可以看

  • 问题内容: 我是Go编程语言的新手,每个教程都从将GOPATH设置为当前项目文件夹开始。 我想念什么吗?程序员真的应该在进入新的Go项目文件夹时手动设置GOPATH 吗?我已经阅读了一些有关GOPATH的常见问题解答条目,但仍然无法解决。 那为什么GOROOT存在呢?目的是什么? 是否有任何自动工具来检测当前目录是否是Go项目的根文件夹(例如通过某个隐藏文件)并自动将GOPATH更改为该目录? 谢

  • 问题内容: 情况1:这不会引起?。谁能告诉我为什么这不会导致ConcurrentModificationException。 情况2:这是由于我尝试访问AsyncThread中的线程不安全的人员列表。我可以使我的“人员列表”实现是线程安全的,并且应该可以运行。 谁能解释我到底发生了什么。我无法理解这是如何解决问题的。 案例2是否将实现从更改为推荐? 添加例外: 05-28 20:34:21.073

  • 问题内容: 年复一年,我试图了解部分与内存模型和并发交易的Java规范。我不得不承认我失败了。是的,我了解锁和“同步”,wait()和notify()。我可以很好地使用它们,谢谢。对于“ volatile”的作用,我什至不清楚。但是所有这些都不是来自语言规范,而是来自一般经验。 这是我要问的两个示例问题。我对特定答案不太感兴趣,因为我需要了解答案是如何从规范中得出的(或者可能是我得出结论,规范没有

  • 问题内容: 好的,所以我试图制作一个可以处理.wav文件的程序,并且已经看到了这个问题/答案,但是我不确定是标题中的每个数据指的是什么。例如,“块”指的是什么?那是特定数量的位/字节吗? 如果有人能至少以本问题中使用的格式告诉我,除常量String Literals和’data’数组外,每个引用到.wav的数据是什么?特别是,我特别想知道什么是“块”,以及所有通道的采样率,字节率,每个采样的字节和