Setting global variables and accessing them in Grails controllers

grailsgroovy

This may be a basic question but I am new to grails and tried looking for a solution.
I need to have a global variable in my groovy controller, a list for example, which is updated in one of the closures (def) and its value is updated in that def,
this new value for the list should be available in other closure/def.
I tried simply:

class MyController {
  def myList = []

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

  def def2 = { println myList}
}

The value of myList should be displayed as the updated value from def1, right now it stays empty. Would static help? or is there a method to pass variables between closures directly, since I dont want the huge list to be passed to GSP and back in the second def.

Best Answer

Your controllers should stay stateless. Controllers are instantiated at each action request, so your member variable myList will be thrown away between actions. If you define it static, it will be shared by all instances of MyController.

If you define myList static, all clients accessing your controller will get the same result. If that's what you want, your list should probably be stored through domain objects in your database (see chapter 5 of Grails documentation, Object Relational Mapping).

If you want each client to have their own myList shared between controller actions, what you are looking for are called web flows. They provide a mechanism to store state between Controller actions performed by a given client. Web flows are documented in Grails documentation (Chapter 6 - The Web Layer).

Related Topic