0

根据文档,Grails 控制器只是一个在名称后附加“Controller”并保存在grails-app/controllers/. 此类中最简单的是:

package some.package

class FooController {
  def index = {}
}

当 Grails 应用程序运行时,该控制器将继承一些标准方法,如getParamsgetSession。从随附的屏幕截图中,我可以看到这些是通过添加的groovy.lang.ExpandoMetaClass。我没有看到这是如何发生的。控制器不实现任何接口或扩展任何抽象。这些方法从何而来?

控制器对象图

4

3 回答 3

5

从 Grails 2.0 开始,采用了一种新方法来将动态方法添加到控制器工件中。您可以逐步访问它们以查看这些属性是如何添加到控制器中的:-

现在,在 Grails 2.0 之前,采用了一种不同的方法来将动态属性添加到控制器。这种方式在运行时将元类属性添加到控制器中,发现效率较低。每个动态属性都由其自己的类(即:GetParamsDynamicProperty、GetSessionDynamicProperty)表示,该类目前未使用。

因此,您现在需要在对象树中查看这些动态方法是控制器中可以使用 CachedMethods 的位置。希望有帮助。如果您寻求更多,我很乐意添加更多。:-)

于 2013-09-18T15:37:59.807 回答
1

你是对的,Grails 的“控制器”并不是真正意义上的控制器,因为它们从基类继承,而是它们只是遵循放置在grails-app/controllers目录中的约定的简单 POGO。编译应用程序时,通过 AST 转换混合了 30 多种方法,其中大部分来自

org.codehaus.groovy.grails.plugins.web.api.ControllersApi, 也从 org.codehaus.groovy.grails.plugins.converters.api.ConvertersControllersApi, org.codehaus.groovy.grails.plugins.web.api.ControllersMimeTypesApi.

前面的内容是 Burt Beckwith 从Programming Grails中转述的,如果您对 Grails 的更详细的细节感兴趣,我会推荐它。

于 2013-09-18T15:47:52.080 回答
0

引用 Burt Beckwith 的优秀著作Programming Grails

超过 30 种方法通过 AST 转换混合到控制器类中。大多数是从 org.codehaus.groovy.grails.plugins.web.api.ControllersApi课堂上添加的

ControllersApi 源码

于 2013-09-18T15:13:51.787 回答