我有一个域名,在该域名中有超过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将在所有用户之间共享。
任何人都可以确认如果让它静止会发生什么? 每个会话都有一个静态表单对象,还是只有一个静态表单对象?
答案 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
}
这应该按预期工作