Groovy Grails-为后续请求存储对象
我有一个web应用程序,前端向服务器发出ajax请求以获取数据。在控制器中,我有以下逻辑: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
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。在这种特殊情况下,您应该在会话对象上同步。