我必须使用网络流吗?

时间:2012-01-15 11:06:40

标签: grails

我想通过几种形式收集域类的数据。我想初始化一个域的实例,通过表单页面(将收集的数据分配给实例的属性)并在最后一个表单成功完成后保存实例。

有没有办法在没有webflow的情况下执行此操作?

2 个答案:

答案 0 :(得分:0)

  

有没有办法在没有webflow的情况下执行此操作?

您可以使用hidden字段来完成此操作。但我可能更喜欢你使用Webflows。

以下是使用Webflow的一些优点:

1)您有两个新的范围flowconversation允许您存储在流程中访问的变量

2)你有简单的DSL来保持整洁

3)由于有flow范围,你可以这样做:

 flow.someThing = new YourClassName(params) //places object in flow scope

请记住:

1)如果你使用流范围的对象,你的类需要实现Serializable类。

2)从Grails 1.2开始,您需要明确安装Webflow插件。文件说:

  

从Grails 1.2开始,Webflow不再是Grails的核心,所以你   必须安装Webflow插件才能使用此功能:grails   install-plugin webflow

(见here)。

答案 1 :(得分:0)

作为Ant评论的替代方案,您可以使用session,但存储非域对象或简单的Map。这肯定会带来很多额外的复杂性,并且webflows 提供了很多防止意外后退按钮等的保护。

粗略的想法:

grails-app/domain

中的

class Widget {
    String name
    int id

    // constraints, etc
}
grails-app/controllers

中的

class WidgetCommand {
    // setup your command
}
class WidgetController {
    def savePage1 = { WidgetCommand cmd ->
        // validate, etc
        def widget = session.tempWidget ?: [:]
        widget.putAll(cmd.properties)
        session.tempWidget = widget
        [widget: widget]
    }
    def savePage2 = { WidgetCommand cmd ->
        // etc
    }
    def savePage3 = {
        // or something similar here
        def finalWidget = new Widget(session.tempWidget)
        finalWidget.save()
    }
}

您可以尝试将实际的域对象直接存储在内存中,但我相信如果您正在编辑对象(而不是新对象),它将自动保存在会话结束时,您将不得不重新链接它到Hibernate会话。