1

如果我想在控制器中的多个方法之间共享一个对象,那么创建一个实例 var 是错误的吗?例如

class MyController {
    def index() {
        def user = verifyUserLogin()
        [messages:getMessages(user)]
    }

    private verifyUserLogin() {
        ...
        return user
    }

    private getMessages(user) {
        ...do something with `user`...
        return messages
    }
}

会成为

class MyController {
    private user

    def index() {
        verifyUserLogin()
        [messages:getMessages()]
    }

    private void verifyUserLogin() {
        ...
        this.user = user
        return
    }

    private getMessages() {
        ...do something with `user`...
        return messages
    }
}
4

3 回答 3

2

Grails 控制器不是单例的,它们是为每个请求创建的,因此拥有实例级变量应该不是任何问题。

但是我个人更喜欢尽可能不声明实例级变量,因为当代码开始变得冗长时,很难弄清楚初始化和使用变量的代码流。

我宁愿选择将它们作为参数传递。然而,没有这样的经验法则,它在很大程度上取决于手头的问题。

于 2013-07-24T11:57:00.137 回答
0

在控制器之间存储状态(即在请求之间传递信息)的传统方式(至少对于 Servlet 而言)是使用session对象。

class MyController(){
   def index(){
       session.user = getUser()
   }

   def postex(){
       def user = session.user
   }
}
于 2013-07-24T23:24:29.587 回答
0

在 grails 3.2.1 中,控制器的默认范围从“prototype”(每个请求的控制器实例)更改为“singleton”(每个控制器的一个实例)。

这使得控制器中的实例变量不再安全,除非您更改范围!

https://docs.grails.org/3.2.1/ref/Controllers/scope.html单例 https://docs.grails.org/3.2.0/ref/Controllers/scope.html原型

如果您确实想在控制器中使用实例变量,请更改范围static scope = "prototype"

您可以在请求上设置变量(作为请求属性),而不是使用实例变量。request.user = user请注意,这些将在请求的整个生命周期内持续存在(对请求遍历的所有拦截器和视图可见)。

于 2018-04-06T17:51:29.680 回答