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

Grails render v respond - conventions for passing to data to the controller

尽管阅读了文档,但我发现一些将数据从控制器传递到视图的 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"就可以给controller提供一个对象,model参数的作用是什么?即

之间有区别吗
respond foo

respond model:[foo: foo]

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

访问

3)最后,简述一下"respond"和"render"的区别是什么?他们似乎都将数据从控制器传递到视图。

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

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

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

Respond: Attempts to return the most appropriate type for the requested content type (specified by either the Accept header or file extension)

Render: To render different forms of responses from simple text responses, to view and templates.

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

My question is, where did this personList variable come from?

respond 方法正在将 Person 的列表添加到模型中,默认情况下将从 Person class 名称生成模型变量名称。