Grails将对象传递给视图并再次返回

时间:2015-01-18 20:15:56

标签: grails controller

我有一些数据需要通过我的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
  }
}

如果我做的话,在我的GSP中

<g:form action="process" params="[gspObject:gspObject]">

然后我收到错误

Cannot cast object 'net.package.MyObject@699c14d8' with class 'java.lang.String' to class 'net.package.MyObject'

我的问题是,如果我想让我发送给gsp的对象回来,我怎么能得到它?是否有某种范围可以保存对象,这会比会话更安全一些?有没有办法将对象传递到页面本身并在下一个请求中将其传回?

1 个答案:

答案 0 :(得分:5)

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以重新实例化该实例。