grails服务具有不同的持久性范围

时间:2013-02-01 18:10:59

标签: grails gorm grails-plugin grails-2.0

我有一个域名,在该域名中有超过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属性定义为static,它会一直存在,但是我担心当它生成时,myObject将在所有用户之间共享。

任何人都可以确认如果让它静止会发生什么? 每个会话都有一个静态表单对象,还是只有一个静态表单对象?

2 个答案:

答案 0 :(得分:2)

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

第一种方法是关闭的,除了你创建一个新的实例而不是将它作为一个Spring bean,所以它的会话范围的事实并没有发挥作用。一般来说,如果您的工作流程超过两页,您应该查看WebFlow,但这可能是一个比您需要的更大的解决方案。

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

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

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

在GSP中你可以参考

${session.formObject}

答案 1 :(得分: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
}

这应该按预期工作