Grails:模板与 TagLibs。 [关闭]

Posted

技术标签:

【中文标题】Grails:模板与 TagLibs。 [关闭]【英文标题】:Grails: Templates vs TagLibs. [closed] 【发布时间】:2010-12-17 03:19:17 【问题描述】:

在 Grails 中,视图层有两种模块化机制:TemplateTagLib

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

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

    这两种机制的主要区别是什么? 在哪些情况下,您使用 TagLib 而不是模板(反之亦然)?

【问题讨论】:

【参考方案1】:

肯定有一些重叠,但以下是需要考虑的几件事。一种思考方式是,Template 就像是方法级别的重用,而 TagLibs 更方便 API 级别的重用。

模板非常适合当您必须格式化特定内容以进行显示时。例如,如果您想以特定方式显示域对象,通常在模板中更容易,因为您基本上只是用一些 .它是可重用的,但我认为它的可重用性有点有限。 IE。如果你有一个模板,你会在几个页面中使用它,而不是在数百页中。

另一方面,taglibs 是一个较小的功能单元,但您更有可能在许多地方使用它。在其中您可能会连接字符串,因此如果您要创建一百行 html,它们就不那么方便了。 taglibs 允许的一个关键特性是注入/与服务交互的能力。例如,如果您需要一段代码来调用身份验证服务并显示当前用户,则只能在 TagLib 中执行此操作。在这种情况下,您不必担心将任何内容传递给 taglib - taglib 会从服务中找出它。您也可能在许多页面中使用它,因此拥有一个不需要参数的 taglib 会更方便。

还有几种 标签库,包括那些允许 你迭代的东西在 身体,有条件,等等 - 那是 模板真的不可能。 正如我上面所说,一个精心制作的 taglib 库可用于创建 一个可重用的 API,使您的 GSP 代码更具可读性。在同一个 *taglib.groovy 中,您可以有多个标签定义,所以这是另一个区别 - 您可以将它们全部分组到一个位置,然后从一个标签库调用到另一个标签库。

另外,请记住,您可以从标签库中调用模板,也可以使用模板调用标签库,因此您可以根据需要进行混合和匹配。

希望这可以为您澄清一点,尽管实际上其中很多是更方便编码的构造以及重复使用的频率。

【讨论】:

太棒了!!正是我所期待的那种答案!你已经用语言表达了我只是从直觉中感受到的东西。谢谢。 “迭代身体中的某些东西,有条件等等 - 这对于模板来说是不可能的” - 呃,对不起?您可以在模板中编写任意 Groovy 代码。即使没有 Groovy 代码,模板也可以遍历数组并执行条件。不过,最好至少这样做。 Victor - 我的意思是在 taglib 主体内你可以运行额外的代码,这与你的 taglib 无关,并不是说你不能在模板中运行代码。我可能应该有更多的资格。 我通常将两者混合使用。我将创建一个标签库来处理准备任何类型的模型,然后使用准备好的模型呈现模板。我尝试遵循的经验法则是大部分 HTML 应该在模板中,而大部分 Groovy 代码应该在 taglib 中。 当输出超过几行 HTML、JS 等时,模板确实提供了更好的可读性。尽管如此,当 TagLibs 比模板更可取时,例如在一个页面中使用多次时的广泛重用或性能原因,但是创建的 HTML 的结构在 TagLib 代码中丢失了 GSP 标签插件允许使用 GSP 定义标签。【参考方案2】:

至于我们……

编码人员应该在模板中看到特定的对象表示逻辑,而不是其他任何地方。

我们仅将标签库用于孤立的页面元素,与业务逻辑完全无关。实际上,我们尽量减少它们的使用:在 taglib 中编写业务逻辑太容易了。

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

【讨论】:

关于在 taglib 中编写业务逻辑的危险的要点。在这方面它类似于控制器。如有疑问,请将其放入服务中,然后调用服务! (来自标签库控制器两者!)

以上是关于Grails:模板与 TagLibs。 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Grails 资源:图像是 404,即使它存在于 WAR 中

从 2.1 升级到 2.2.4 后 Grails 自动编译中断

Grails:Grails Doc 的替代品? [关闭]

Rails 还是 Grails? [关闭]

Grails 5.0.1 - 自定义脚手架 edit.gsp 模板和其他

Java模板设计模式与接口