我有一些数据,我需要通过我的Grails应用程序中的多个操作来坚持。由于数据的性质,我宁愿不将数据存储在会话中。以下是我想要做的事情的一个例子。
class MyController{
def index(){
MyObject object = MyObject.new(params.first, params.second, params.third)
[gspObject:object]
}
def process(){
MyObject object = params.gspObject
//continue from here
}
}
在我的普惠制中
<g:form action="process" params="[gspObject:gspObject]">
那么我就得到了错误
Cannot cast object 'net.package.MyObject@699c14d8' with class 'java.lang.String' to class 'net.package.MyObject'
我的问题是,如果我想要拿回我发送给普惠制的对象,我怎么能得到它?我是否可以将对象保存在比会话更安全的范围内?是否有方法将对象传递到页面本身并在下一个请求中将其传回?
发布于 2015-01-18 21:25:38
Grails有很多层,但是在底层您有一个普通的旧HTTP,就像在任何web应用程序中一样。这是一种无状态协议,您发送文本或二进制响应,并接收文本或文本+二进制请求。但是,您不能期望能够以HTML的形式将任意对象发送到web浏览器,然后以与发送时相同的状态再次接收它--这个Java/Groovy JVM对象将存储在浏览器中的何处?
你基本上有两个选择。一种是将其存储在服务器上,这是较少的工作,因为它始终作为相同的对象。会话是一个很好的位置,因为它是与用户耦合的,是按需创建的,并且可以自动超时并被删除等等。另一个是执行您想要做的事情--将它发送到客户端并接收回它--但是您必须从一个对象(它可能是一个包含任意多个其他对象的复杂对象)序列化它,并将它从客户机上使用的格式反序列化到Java/Groovy对象中。
JSON是序列化/编组的好选择。如果页面使用表单,则可以将字符串化的对象存储在隐藏的窗体元素中;如果单击此页到工作流中的下一个链接,则可以将其存储在查询字符串arg中。但是,不要发送对象的所有数据,只发送重建对象所需的数据。数据库中可用的任何内容都应该由id引用并重新加载。
有点像
[gspObject: object as JSON]
或
[gspObject: [first: object.first, first: object.firstsecond, ...] as JSON]
将它以正确的格式发送,然后您可以从请求中解析JSON以恢复实例。
https://stackoverflow.com/questions/28014365
复制相似问题