Grails:模板 vs TagLibs。

30

在Grails中,视图层有两种模块化机制:模板(Template)标签库(TagLib)

当我编写自己的Grails应用程序时,当需要编写UI组件时,我经常遇到同样的问题:我需要使用模板还是标签库?

在搜索网络后,我没有找到关于这个设计决策的很多最佳实践或经验法则,所以你能帮助我并告诉我:

  1. 这两种机制的主要区别是什么?
  2. 在哪些情况下,您将使用标签库而不是模板(反之亦然)?
2个回答

24

这两个概念有些重叠,但以下是需要考虑的一些事情。可以这样理解:模板是方法级别的重用,而TagLibs更适合API级别的重用。

  • 模板非常适合用于将某些特定内容格式化后展示。例如,如果你想以特定方式展示一个域对象,通常使用模板会更容易,因为你基本上只是在写一些HTML代码。它具有可重用性,但我认为它的可重用性有些有限。也就是说,如果你有一个模板,你会在多个页面中使用它,而不是在数百个页面中使用。

  • 另一方面,taglib是更小的功能单元,但你更有可能在许多地方使用它。在其中,你很可能要连接字符串,所以如果你要创建一百行的HTML代码,它们就不那么方便了。一个关键的特点是标签库允许注入/与服务交互。例如,如果你需要一个调用身份验证服务并显示当前用户的代码片段,你只能在TagLib中实现。在这种情况下,你不必担心向标签库传递任何东西 - 标签库会从服务中找到并处理。你也可能在许多页面中使用它,因此拥有一个不需要参数的标签库更方便。

  • 还有一些类型的taglibs,包括允许在body中迭代某些内容、具有条件语句等等 - 这在模板中并不是很容易实现。正如我上面所说,一个精心制作的taglib库可以用来创建可重用的API,使你的GSP代码更容易读懂。在同一个*taglib.groovy文件中,你可以拥有多个标签定义,这也是另一个区别 - 你可以将它们全部组合到一个地方,并从一个标签库中调用另一个标签库。

同时请注意,您可以从标签库内部调用模板,也可以在模板中调用标签库,因此您可以根据需要进行混合和匹配。

希望这能为您解决一些问题,不过实际上,很多时候选择哪种构造更方便编码,以及它将被重用的频率。


1
太好了!!这正是我期望的答案!你用言语表达出了我只有直觉感受到的东西,而且还没有过多地形式化。谢谢你。 - fabien7474
1
在模板中迭代某些内容、使用条件语句等,这些都不太可能实现,但是您可以在模板中编写任意的 Groovy 代码。即使没有 Groovy 代码,模板也可以迭代数组并执行条件语句。然而,最好尽量避免在模板中过多地添加代码。 - Victor Sergienko
Victor - 我的意思是在 taglib 的 body 中,你可以运行与 taglib 无关的其他代码,而不是说你不能在模板中运行代码。我可能应该更加明确。 - Jean Barmash
4
我通常会使用两者的混合方法。我会创建一个标签库来处理任何类型的模型,然后使用准备好的模型呈现模板。 我遵循的经验法则是HTML的大部分应该在模板中,而Groovy代码的大部分应该在标签库中。 - Matt Lachman
1
当输出超过几行HTML、JS等内容时,模板确实可以提供更好的可读性。但是,在需要多次使用或出于性能原因而优先考虑标签库(TagLibs)时,例如在一个页面中多次使用,但所创建的HTML结构在TagLib代码中丢失时,GSP标签插件允许使用GSP定义标签。 - Ruben
这个答案的关键之一是能够从标签库中拉取服务。这使得标签库非常适合像顶级导航这样需要了解当前用户的东西。通过模板做这种事情非常痛苦,但在标签库中做这件事却很简单。 - cdeszaq

3

关于我们...

程序员应该在模板中看到特定的对象呈现逻辑,而不是在其他地方。

我们仅针对与业务逻辑无关的隔离页面元素使用标签库。实际上,我们尽量减少它们的使用:在标签库中编写业务逻辑太容易了。

模板是走向传统的方式;例如,它们支持布局(顺便说一句,它们可以被称为第三种机制)


关于在标签库中编写业务逻辑的危险性,这是一个很好的观点。它与控制器类似。当有疑问时,请将其放入服务中,然后调用该服务!(可以从标签库或控制器或两者中调用!) - cdeszaq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接