Groovy Grails-为后续请求存储对象

Groovy Grails-为后续请求存储对象,grails,groovy,request,Grails,Groovy,Request,我有一个web应用程序,前端向服务器发出ajax请求以获取数据。在控制器中,我有以下逻辑: def data = [] def method() { def objects = [] ... from params determine if it is a first request ... if (firstRequest) { objects = someService.getObjectFromDB() data = objects } else

我有一个web应用程序,前端向服务器发出ajax请求以获取数据。在控制器中,我有以下逻辑:

def data = []

def method() {
  def objects = []
  ...
  from params determine if it is a first request
  ...
  if (firstRequest) {
    objects = someService.getObjectFromDB()
    data = objects
  } else {
    actions with data object
  } 

但问题是,对于2+请求
数据
是一个空列表,尽管在第一个请求期间,我用所需信息填充了它。如何使用
数据
对象是2+请求?

将数据对象存储在用户会话中,如:

session.data = objects
当您输入方法时,数据的检查已经存在

if (!session?.data) {
    // first request
    objects = someService.getObjectFromDB()
    session.data = objects
} else {
    // retrieve data from session
    def oldData = session.data
    // do something
}

这可能不是最好的解决方案,因为您将在会话中存储大量信息,因此请尝试将其限制在最低限度。

在用户会话中存储数据对象,如:

session.data = objects
当您输入方法时,数据的检查已经存在

if (!session?.data) {
    // first request
    objects = someService.getObjectFromDB()
    session.data = objects
} else {
    // retrieve data from session
    def oldData = session.data
    // do something
}

这可能不是最好的解决方案,因为您将在会话中存储大量信息,因此请尝试将其限制在最低限度。

我建议将上述逻辑从控制器移动到服务类。这样做的好处:-

1.服务默认为单例。您可以将作用域设置为
request
,从而获得每个请求的全局数据句柄

2.会话不会因数据而过载


3.最佳部分:-您可以在方法调用中将
参数
&/|
请求
(控制器的默认值)传递到服务层。

我建议将上述逻辑从控制器移动到服务类。这样做的好处:-

1.服务默认为单例。您可以将作用域设置为
request
,从而获得每个请求的全局数据句柄

2.会话不会因数据而过载


3.最佳部分:-您可以在方法调用中将
参数
&/|
请求
(控制器的默认值)传递给服务层。

您应该小心使用这种方法,因为如果您的对象图已部分加载(即某些关系被延迟获取),您的对象将从hibernate会话中分离出来然后,当尝试从会话作用域访问对象时,将出现LazyInitializationExceptions。构建GSP页面后(在第一次请求时),Hibernate会话将关闭。使用这种方法时应小心,因为如果对象图已部分加载(即某些关系被延迟获取),则对象将从Hibernate会话中分离然后,当尝试从会话作用域访问对象时,将出现LazyInitializationExceptions。Hibernate会话在GSP页面构建完成后(根据第一个请求)关闭。该解决方案不是线程安全的,您可以获得两次更新的session.data。例如,如果第一个请求将从数据库检索数据,而第二个请求将发现session.data==null。在这种特殊情况下,您应该在会话对象上进行同步。该解决方案不是线程安全的,您可以将session.data更新两次。例如,如果第一个请求将从数据库检索数据,而第二个请求将发现session.data==null。在这种特殊情况下,您应该在会话对象上同步。