在Grails中,视图层有两种模块化机制:模板(Template)和标签库(TagLib)。
当我编写自己的Grails应用程序时,当需要编写UI组件时,我经常遇到同样的问题:我需要使用模板还是标签库?
在搜索网络后,我没有找到关于这个设计决策的很多最佳实践或经验法则,所以你能帮助我并告诉我:
- 这两种机制的主要区别是什么?
- 在哪些情况下,您将使用标签库而不是模板(反之亦然)?
这两个概念有些重叠,但以下是需要考虑的一些事情。可以这样理解:模板是方法级别的重用,而TagLibs更适合API级别的重用。
模板非常适合用于将某些特定内容格式化后展示。例如,如果你想以特定方式展示一个域对象,通常使用模板会更容易,因为你基本上只是在写一些HTML代码。它具有可重用性,但我认为它的可重用性有些有限。也就是说,如果你有一个模板,你会在多个页面中使用它,而不是在数百个页面中使用。
另一方面,taglib是更小的功能单元,但你更有可能在许多地方使用它。在其中,你很可能要连接字符串,所以如果你要创建一百行的HTML代码,它们就不那么方便了。一个关键的特点是标签库允许注入/与服务交互。例如,如果你需要一个调用身份验证服务并显示当前用户的代码片段,你只能在TagLib中实现。在这种情况下,你不必担心向标签库传递任何东西 - 标签库会从服务中找到并处理。你也可能在许多页面中使用它,因此拥有一个不需要参数的标签库更方便。
还有一些类型的taglibs,包括允许在body中迭代某些内容、具有条件语句等等 - 这在模板中并不是很容易实现。正如我上面所说,一个精心制作的taglib库可以用来创建可重用的API,使你的GSP代码更容易读懂。在同一个*taglib.groovy文件中,你可以拥有多个标签定义,这也是另一个区别 - 你可以将它们全部组合到一个地方,并从一个标签库中调用另一个标签库。
同时请注意,您可以从标签库内部调用模板,也可以在模板中调用标签库,因此您可以根据需要进行混合和匹配。
希望这能为您解决一些问题,不过实际上,很多时候选择哪种构造更方便编码,以及它将被重用的频率。
关于我们...
程序员应该在模板中看到特定的对象呈现逻辑,而不是在其他地方。
我们仅针对与业务逻辑无关的隔离页面元素使用标签库。实际上,我们尽量减少它们的使用:在标签库中编写业务逻辑太容易了。
模板是走向传统的方式;例如,它们支持布局(顺便说一句,它们可以被称为第三种机制)