2011-11-02 104 views
1

这可能是一个基本问题,但我是grails的新手,并试图寻找解决方案。 我需要在我的groovy控制器中有一个全局变量,例如一个列表,在其中一个闭包中更新(def),其值在该def中更新, 该列表的这个新值应该可用于其他关闭/ DEF。 我想简单地说:设置全局变量并在Grails控制器中访问它们

class MyController { 
    def myList = [] 

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

    def def2 = { println myList} 
} 

myList值应该从def1显示为更新后的值,现在它保持为空。 static会有帮助吗?或者是否有一种方法直接在闭包之间传递变量,因为我不想将巨大的列表传递给GSP,并返回到第二个def

+0

这个用例可以简单地使用会话。将myList变量存储到用户的会话中。 – hitty5

回答

4

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

如果您定义了myList static,则访问您的控制器的所有客户端将获得相同的结果。如果这就是你想要的,你的列表应该可以通过域对象存储在你的数据库中(see chapter 5 of Grails documentation, Object Relational Mapping)。

如果希望每个客户都有自己的myList控制器动作,你正在寻找被称为网络流之间共享。它们提供了一种机制来存储由给定客户端执行的控制器操作之间的状态。 Web流量记录在Grails documentation (Chapter 6 - The Web Layer)中。

+0

感谢您的提示! ......肯定会记住这些。 –

0

当然,我完全同意@antoine关于无状态控制器。从广义上讲,MVC范式很大程度上改变了编程中的变量的方式:如果要持久保存值,则始终要考虑GORM和DB。
无论如何,可能有一个有趣的替代方式来处理全球价值;所有控制器操作以及服务的全局值:使用用户会话。例如:

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中找到正确更新的内容。请记住,此全局性仅限于具有用户会话所有限制的用户会话。但这是正确的,因为在用户使用系统之前用户会话是全局的,与所有其他用户同时使用它是分开的。如果同一用户获得另一个会话,则会丢失值。