我有一个域,在那个域中有25个以上的成员。
该成员的值(value)将来自一种形式。但是,填补这些过多的领域实在是太糟糕了。所以我想将输入形式分为不同的阶段。
我制作了一个名为FormObject的类,该类具有用于所有所需输入的字段。
问题是没有办法在页面之间传递此对象。
我当时在想,具有 session 范围的服务可能会让我保留对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将在所有用户之间共享。
任何人都可以确认如果将其设为静态会发生什么情况?
每个 session 都会有一个静态表单对象还是只有一个静态表单对象?
最佳答案
我找到了解决方案...
第一种方法很接近,除了您要创建一个新实例而不是将其作为Spring bean获取之外,因此它不会受到 session 作用域的影响。通常,如果您的工作流跨越两个以上的页面,则应查看WebFlow,但这可能是比您需要的解决方案更大的解决方案。
我将跳过服务包装器,仅将对象存储在 session 中。这样做的风险是,如果发生某些事情并且您没有删除它们,最终可能会污染对象的 session ,因此应该进行处理。
在第一个 Controller 操作中,确保对象在其中:
def action1 = {
... regular work
session.formObject = new FormObject()
// return model, e.g.
[foo: bar]
}
在GSP中,您可以引用它
${session.formObject}
关于使服务具有不同的持久性范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14652469/