我有一些数据需要通过我的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
}
}
Run Code Online (Sandbox Code Playgroud)
在我的GSP中,如果我这样做
<g:form action="process" params="[gspObject:gspObject]">
Run Code Online (Sandbox Code Playgroud)
然后我得到了错误
Cannot cast object 'net.package.MyObject@699c14d8' with class 'java.lang.String' to class 'net.package.MyObject'
Run Code Online (Sandbox Code Playgroud)
我的问题是,如果我想把我发送给gsp的对象拿回来,我怎么能得到它?是否有某种范围可以保存对象,这会比会话更安全一些?有没有办法将对象传递到页面本身并在下一个请求中将其传回?
Grails有很多层,但是在底层你有简单的旧HTTP,就像在任何web应用程序中一样.它是一个无状态协议,您发送文本或二进制响应,并接收文本或文本+二进制请求.但是你不能指望能够将任意对象发送到HTML中的Web浏览器并以与发送时相同的状态再次接收它 - 这个Java/Groovy JVM对象将存储在浏览器中的哪个位置?
你基本上有两个选择.一种是将它存储在服务器上,这样做的工作量较少,因为它始终作为同一个对象.会话是一个很好的位置,因为它与用户耦合,按需创建,可以自动超时和删除等.另一个是做你想做的事情 - 发送到客户端并接收它返回 - 但是您必须从对象(可能是包含任意多个其他对象的复杂对象)序列化它,并将其从您在客户端上使用的格式反序列化为Java/Groovy对象.
JSON是序列化/编组的好选择.如果页面使用表单,则可以将字符串化对象存储在隐藏表单元素中;如果单击工作流中从此页面到下一个页面的链接,则可以将字符串化对象存储在查询字符串arg中.不要发送所有对象的数据,只需要重建它所需的数据.数据库中可用的任何内容都应该由id引用并重新加载.
就像是
[gspObject: object as JSON]
Run Code Online (Sandbox Code Playgroud)
要么
[gspObject: [first: object.first, first: object.firstsecond, ...] as JSON]
Run Code Online (Sandbox Code Playgroud)
将以正确的发送格式获取它,然后您可以从请求中解析JSON以重新实例化该实例.
| 归档时间: |
|
| 查看次数: |
1927 次 |
| 最近记录: |