如果我通过以下方式使 Grails 控制器成为单例:
static scope = "singleton"
... Grails 如何将params
变量公开给我的控制器的操作,其中params
特定于请求?
我会理解是否params
作为变量传递到我的操作方法中,但这里params
只是可用且在范围内(尽管我的控制器只有一个实例,但同时请求不同)。
这是如何在幕后实现的?
如果我通过以下方式使 Grails 控制器成为单例:
static scope = "singleton"
... Grails 如何将params
变量公开给我的控制器的操作,其中params
特定于请求?
我会理解是否params
作为变量传递到我的操作方法中,但这里params
只是可用且在范围内(尽管我的控制器只有一个实例,但同时请求不同)。
这是如何在幕后实现的?
每个请求都有自己的线程,因此请求、响应、参数、会话等都可用,而与控制器是单例还是为每个请求创建新的无关。如果这些变量是类中的字段,情况会有所不同,但它们不是。
在幕后,这是通过混入org.codehaus.groovy.grails.plugins.web.api.ControllersApi
控制器类的 AST 转换实现的,它添加了诸如getParams()
(您可以将其用作params
属性)之类的方法。这些调用RequestContextHolder.currentRequestAttributes()
以获取线程本地信息。