2011-11-02 40 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中找到正確更新的內容。請記住,此全局性僅限於具有用戶會話所有限制的用戶會話。但這是正確的,因爲在用戶使用系統之前用戶會話是全局的,與所有其他用戶同時使用它是分開的。如果同一用戶獲得另一個會話,則會丟失值。