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-这是我的想法,所以有一个确认是很好的。