Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails 向控制器添加实例变量是否错误?_Grails_Scope_Grails Controller - Fatal编程技术网

Grails 向控制器添加实例变量是否错误?

Grails 向控制器添加实例变量是否错误?,grails,scope,grails-controller,Grails,Scope,Grails Controller,如果我想在一个控制器中的多个方法之间共享一个对象,那么创建一个实例变量是错误的吗?例如 class MyController { def index() { def user = verifyUserLogin() [messages:getMessages(user)] } private verifyUserLogin() { ... return user } private get

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

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
    }
}

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

然而,我个人不喜欢尽可能多地声明实例级变量,因为当代码开始变得冗长时,很难确定初始化和使用变量的代码流


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

至少对于servlet来说,在控制器之间存储状态的传统方法(即在请求之间传递信息)是使用对象

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

   def postex(){
       def user = session.user
   }
}

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

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

独生子女 原型

如果确实要在控制器中使用实例变量,请更改作用域
static scope=“prototype”


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

我想
verifyUserLogin
getMessages
应该是servicesey,感谢您提供的信息。但是,在本例中,我并不是在请求之间传递信息,而是在同一请求中的方法之间传递信息。在这种情况下,您需要创建一个POJO并将其传递给您的方法参数:
getMessages(User)
。控制器用于渲染视图。一个方法调用,比如获取特定用户的消息,无论如何都可能属于用户域类。谢谢@sudhir-这是我的想法,所以有一个确认是很好的。