6

我有一个域,在该域​​中有超过 25 个成员。该成员的价值将来自一种形式。但是填满那些太多的领域感觉很糟糕。所以我想把输入形式分成不同的阶段。

我创建了一个名为 FormObject 的类,其中包含所有所需输入的字段。问题是没有办法在页面之间传递这个对象。

我在想也许具有会话范围的服务将允许我保留对 FormObject 的引用,并且只需从服务中调用一个方法来再次获取它。

<g:set var="formService" value="${new FormService()}" /> 

class FormService{
    static transactional = false
    static scope = "session"

    FormObject myObject = new FormObject()

    def resetForm(){
        myObject=new FormObject()
    }

    def getForm(){
        return myObject
    }
}

并将其用于 GSP 之类的

<g:set var="myForm" value="${formService.getForm()}" />

但是,数据不会在页面之间保留。

如果我将 myObject 属性定义为静态,它确实会持续存在,但我担心当它投入生产时,myObject 将在所有用户之间共享。

谁能确认如果我将其设为静态会发生什么?每个会话会有一个静态表单对象还是只有一个静态表单对象?

4

2 回答 2

2

我得到了解决方案....

第一种方法很接近,除了您要创建一个新实例而不是将其作为 Spring bean 获取,因此它是会话范围的事实并没有发挥作用。一般来说,如果您的工作流程跨越两个以上的页面,您应该查看 WebFlow,但这可能是一个比您需要的更大的解决方案。

我会跳过服务包装器并将对象存储在会话中。这里的风险是,如果发生某些事情并且您没有删除它们,您最终可能会用对象污染您的会话,因此您应该处理它。

在第一个控制器动作中,确保对象在那里:

def action1 = {
   ... regular work
   session.formObject = new FormObject()
   // return model, e.g.
   [foo: bar]
}

在普惠制中你可以参考它

${session.formObject}
于 2013-02-01T18:10:58.563 回答
1

我可能会采取另一种方法并通过控制器通过模型提供表单对象 - 所有持久性问题也将通过控制器完成,因此您的第一种方法将按预期工作......

function showForm() {
  render[view: 'view', model: [serviceForm: formService.form]]
}

function persistForm(MyCommand cmd) {
  // check cmd for errors
  if(cmd.hasErrors()) {
    // return the MyCommand object for error yielding
    render(view: 'view', model: [cmd: cmd]]
  }
  // persist cmd fields to formService.form object
  formService.form.field = cmd.field
}

这应该按预期工作

于 2013-02-05T10:41:18.713 回答