Установка глобальных переменных и доступ к ним в контроллерах Grails - PullRequest
1 голос
/ 02 ноября 2011

Это может быть основной вопрос, но я новичок в Grails и попытался найти решение. Мне нужно иметь глобальную переменную в моем контроллере groovy, например, список, который обновляется в одном из замыканий (def), а его значение обновляется в этом def, это новое значение для списка должно быть доступно в другом закрытии / определении. Я попробовал просто:

class MyController {
  def myList = []

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

  def def2 = { println myList}
}

Значение myList должно отображаться как обновленное значение с def1, сейчас оно остается пустым. static поможет? или есть метод для передачи переменных между замыканиями напрямую, так как я не хочу, чтобы огромный список передавался в GSP и обратно во второй def.

Ответы [ 2 ]

4 голосов
/ 02 ноября 2011

Ваши контроллеры должны оставаться без состояния.Контроллеры создаются при каждом запросе действия, поэтому ваша переменная-член myList будет выброшена между действиями.Если вы определите его как статический, он будет использоваться всеми экземплярами MyController.

Если вы определите myList static, все клиенты, получающие доступ к вашему контроллеру, получат одинаковый результат.Если это то, что вам нужно, ваш список, вероятно, следует сохранить через доменные объекты в вашей базе данных ( см. Главу 5 документации Grails, реляционное сопоставление объектов ).

ЕслиВы хотите, чтобы у каждого клиента были свои собственные myList, общие для действий контроллера, то, что вы ищете, называется веб-потоки .Они предоставляют механизм для сохранения состояния между действиями контроллера, выполняемыми данным клиентом.Веб-потоки описаны в документации Grails (Глава 6 - Веб-уровень) .

0 голосов
/ 27 октября 2016

Конечно, я полностью согласен с @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" и внутри нее помещаю флаг. Затем я возвращаюсь к сеансу в сервисе и обнаружил, что внутри моего флага правильно обновлено. Имейте в виду, что эта глобальность ограничена сеансом пользователя со всеми ограничениями относительно сеанса пользователя. Но это правильно, потому что пользовательский сеанс является чем-то глобальным, пока пользователь не использует систему, будучи отделенным от всех других пользователей, использующих ее одновременно. И потерять значения, если тот же пользователь получит другой сеанс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...