Grails render v respond - 将数据传递给控制器​​的约定

Posted

技术标签:

【中文标题】Grails render v respond - 将数据传递给控制器​​的约定【英文标题】:Grails render v respond - conventions for passing to data to the controller 【发布时间】:2017-04-11 16:05:07 【问题描述】:

尽管阅读了文档,但我发现一些用于将数据从控制器传递到视图的 Grails 约定有点不透明。几个基本问​​题:

这里有一些问题:

1) 在为“Person”控制器创建的脚手架中,索引操作以

结尾
respond Person.list(params) model:[personCount: Person.count()]

在 index.gsp 中,列表通过以下方式呈现给浏览器:

<f:table collection="$personList" />

我的问题是,这个 personList 变量是从哪里来的?或者换一种说法,控制器中 Person.list(...) 的输出是如何显示在名为 personList 的视图中的?是否有关于是否调用的通用规则

respond foo

而foo是一个列表,那么它会以“fooList”的名字出现在控制器中?

2) 如果说“render foo”就可以给控制器提供一个对象,那么模型参数的作用是什么?即

之间有什么区别吗
respond foo

respond model:[foo: foo]

似乎两者都可以使用"$foo"在视图中访问

3) 最后,“响应”和“渲染”之间的区别的简明描述是什么?它们似乎都将数据从控制器传递到视图。

【问题讨论】:

如果有什么安慰的话,我也觉得响应非常神秘,因为它具有内在的魔力,如果你的情况不完全符合,你真的不知道发生了什么或如何使用一个例子。例如。我想用两个对象进行响应,但我不知道如何执行此操作,因为文档说您只能将单个对象作为参数(+ 参数参数)传递。如果您需要使用参数参数来传递其他对象,或者如果您有两个对象而不是对象,这会让人感到困惑。我阅读了响应文档并决定渲染会节省大量调试时间 有趣的是,我已经在 Grails 中编写了数百个 JSON API 和数千个 UI 控制器。我几乎从未遇到过 API 控制器方法和输出与 UI 控制器方法之间存在重叠的情况,因此在我的情况下,响应无济于事。 【参考方案1】:

因此,文档很好地解释了respond 和render,并指出了两者之间的区别。特别是您提出的问题。

不过,我还是会在这里回答他们:

    使用respond 时,它将尝试根据类型确定适当的模型变量名称。因此,对于您的示例,由于Person.list() 返回List,模型变量变为personList,在您的另一个示例中,如果fooList,它确实变为fooList。这在有关 respond 的文档中进行了解释(带有具体示例)。 respondrender 的不同之处在于 respond 尝试使用基于 accept 标头(或文件扩展名)的最合适的模型进行回复。 render 允许您更具体地控制以呈现响应,而不管 accept 标头(或文件扩展名)如何。这在文档中对两者的描述中也很清楚。 差异的简明描述可在respondrender 的描述中找到(来自文档):

响应:尝试返回最合适的类型 请求的内容类型(由 Accept 标头或文件指定 扩展名)

渲染:从简单的文本中渲染不同形式的响应 响应,查看和模板。

简单地说:“当您想要支持多种类型的响应类型并遵循 Grails 约定时使用respond,当您想要更具体地控制响应类型时使用render

【讨论】:

谢谢约书亚。我看到的页面是 Google 搜索“Grails 响应”返回的页面,该页面链接到 3.1.1 版的文档,该文档非常粗略。新页面有了很大改进。【参考方案2】:

我的问题是,这个 personList 变量是从哪里来的?

respond 方法是将Person 的列表添加到模型中,默认情况下会从Person 类名生成模型变量名。

【讨论】:

以上是关于Grails render v respond - 将数据传递给控制器​​的约定的主要内容,如果未能解决你的问题,请参考以下文章

grails中renderrespondredirect的使用

带有片段参数的 Grails render()

在 grails 服务中使用 g.render

如何删除grails中的spring安全令牌?

Grails:将模板渲染为字符串

我需要在 Grails 中返回“渲染”吗?