设置全局变量并在Grails控制器中访问它们

设置全局变量并在Grails控制器中访问它们,grails,groovy,Grails,Groovy,这可能是一个基本问题,但我对grails还不熟悉,并尝试寻找解决方案。 我需要在groovy控制器中有一个全局变量,例如一个列表,它在一个闭包(def)中更新,它的值在该def中更新, 该列表的新值应在其他closure/def中可用。 我试着简单地说: class MyController { def myList = [] def def1 = { myList = someList.clone();} def def2 = { println myList} } myLi

这可能是一个基本问题,但我对grails还不熟悉,并尝试寻找解决方案。 我需要在groovy控制器中有一个全局变量,例如一个列表,它在一个闭包(def)中更新,它的值在该def中更新, 该列表的新值应在其他closure/def中可用。 我试着简单地说:

class MyController {
  def myList = []

  def def1 = { myList = someList.clone();}

  def def2 = { println myList}
}

myList
的值应显示为
def1
中的更新值,现在它保持为空。
static
会有帮助吗?或者有没有一种方法可以在闭包之间直接传递变量,因为我不希望庞大的列表在第二个
def
中传递给GSP并返回,所以您的控制器应该保持无状态。每个操作请求都会实例化控制器,因此成员变量
myList
将在操作之间被丢弃。如果您将其定义为静态,则它将由
MyController
的所有实例共享

如果定义
myList
static,则访问控制器的所有客户端将得到相同的结果。如果这是您想要的,那么您的列表可能应该通过数据库()中的域对象存储


如果您希望每个客户端在控制器操作之间共享自己的
myList
,则您要查找的内容称为web流。它们提供了一种机制来存储给定客户端执行的控制器操作之间的状态。Web流记录在中。

您的控制器应保持无状态。每个操作请求都会实例化控制器,因此成员变量
myList
将在操作之间被丢弃。如果您将其定义为静态,则它将由
MyController
的所有实例共享

如果定义
myList
static,则访问控制器的所有客户端将得到相同的结果。如果这是您想要的,那么您的列表可能应该通过数据库()中的域对象存储


如果您希望每个客户端在控制器操作之间共享自己的
myList
,则您要查找的内容称为web流。它们提供了一种机制来存储给定客户端执行的控制器操作之间的状态。Web流记录在中。

当然,我完全同意@antoine关于控制器无状态的观点。从广义上讲,MVC范式改变了编程中考虑变量的方式:如果要保持值,就必须考虑GRM和DB。br/> 无论如何,可能有一种有趣的方式来处理全球价值观;所有控制器操作和服务的global值:使用用户会话。例如:

Class MyController {
   def myService

   def act1 = {
       session.myvalues = [:]
       session.myvalues.myflag = true
       ...
       myService.service1()
   }
}
在使用它的服务中

Class MyService {
   def service1() {
       def sess = RequestContextHolder.currentRequestAttributes().getSession()
       if (sess?.myvalues?.myflag) println "Found true in myflag"
   }
}

所以,我在用户会话中准备了一个名为“myvalues”的空映射,并在其中放置了一个标志。然后我返回服务中的会话,我发现myflag内部已正确更新。请记住,这种全局性仅限于用户会话,而所有关于用户会话的限制都存在。但这是正确的,因为在用户使用系统之前,用户会话是全局的,与同时使用它的所有其他用户保持分离。如果同一用户获得另一个会话,则会丢失值。

当然,我完全同意@antoine关于控制器无状态的说法。从广义上讲,MVC范式改变了编程中考虑变量的方式:如果要保持值,就必须考虑GRM和DB。br/> 无论如何,可能有一种有趣的方式来处理全球价值观;所有控制器操作和服务的global值:使用用户会话。例如:

Class MyController {
   def myService

   def act1 = {
       session.myvalues = [:]
       session.myvalues.myflag = true
       ...
       myService.service1()
   }
}
在使用它的服务中

Class MyService {
   def service1() {
       def sess = RequestContextHolder.currentRequestAttributes().getSession()
       if (sess?.myvalues?.myflag) println "Found true in myflag"
   }
}

所以,我在用户会话中准备了一个名为“myvalues”的空映射,并在其中放置了一个标志。然后我返回服务中的会话,我发现myflag内部已正确更新。请记住,这种全局性仅限于用户会话,而所有关于用户会话的限制都存在。但这是正确的,因为在用户使用系统之前,用户会话是全局的,与同时使用它的所有其他用户保持分离。如果同一用户获得另一个会话,则会丢失这些值。

对于本用例,您只需使用会话即可。将myList变量存储到用户的会话中。对于此用例,您只需使用会话即可。将myList变量存储到用户会话中。