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

san*_*vi7 6 grails grails-orm 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
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其用于GSP中

<g:set var="myForm" value="${formService.getForm()}" />
Run Code Online (Sandbox Code Playgroud)

但是,页面之间的数据不会持续存在.

如果我将myObject属性定义为static,它会持续存在,但我担心当它生成时,myObject将在所有用户之间共享.

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

san*_*vi7 2

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

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

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

在第一个控制器操作中,确保该对象存在:

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

在普惠制中你可以参考它

${session.formObject}
Run Code Online (Sandbox Code Playgroud)

  • 为什么你要像在与另一个人交谈一样回答自己的问题?哈哈。 (2认同)