将两个gsp屏幕连接到grails中的三个域

时间:2016-08-29 19:58:53

标签: grails gorm

因此,当用户点击列表屏幕上的“创建”时,我正在开发一个Web应用程序,它会将他们带到一个页面,在那里他们必须输入一些信息,然后他们点击" next"并且它会将它们带到另一个gsp页面,在那里他们必须为两个域输入数据,但是没有数据存储在表中但是当他们点击"创建"按钮,一切都存储在数据库中 我在寻找例子但却找不到任何例子。 我知道如何调用记录并编辑它,因为所有域或表共享id号,所以我可以用它来检索数据。但我的问题是当我从第一个gsp屏幕转移到另一个我要保存实例然后当用户点击创建时,数据转到三个表

任何想法怎么做?我还是初学者并且正在努力学习 谢谢

4 个答案:

答案 0 :(得分:0)

这听起来有点令人困惑,你想做什么,我不确定我完全理解。因为你想改变整个页面,但是,不要丢失那些以前的答案,对吧?您有什么特别的理由想要这样做吗?

我相信您可以将第一个gsp中的所有信息发送到控制器并将所有内容保存在“会话”中(例如session.name = params.name,session.age = params.age),重定向/渲染其他gsp以及稍后,您将从会话中获取信息以及刚刚发布的信息并保存所有内容。这可能不是一个很好的解决方案,但这是我解决这个问题的唯一方法。

:)

答案 1 :(得分:0)

只是一个想法,我直到现在才使用它,但我将来某一天会修改当前应用程序中的对话框流程...:

这不是webflow-plugin的好例子吗?

答案 2 :(得分:0)

这是用于命令对象的内容。每当你有一个要在表单中收集的数据集合然后从中“生成”多个域对象时,就是这样。

我们的想法是创建一个包含您要在表单上收集的所有信息的类。将填充的表单数据发布回控制器保存操作,然后使用命令对象约束验证数据是否已完成。一旦对所有内容感到满意,就可以使用命令对象中的数据来创建/更新域对象。

我们认为使用命令对象是Grails的最佳实践。您可以在命令对象中提供自定义验证支持,以查找和验证数据中与域对象难以处理的关系。我们经常在命令类中编写工厂方法来生成新的或更新的域对象,这使得它非常便于单元测试。

有关详细信息,请参阅手册中“Web图层”的“命令对象”部分。在Grails 2中,命令对象是具有@Validateable注释的类,在Grails 3中,它们实现Validateable特征。如果将命令类声明为控制器中的内部类,则它可以自动验证。我们发现我们更喜欢在src / groovy中声明它们而不是内部类,因为对于不熟悉代码的人来说,它们更容易找到。

答案 3 :(得分:0)

因此,在所有这些答案中,你都有答案,但诚实地说,我认为这远远超出了你自己的理解。

假设您将此示例作为表单

http://code.runnable.com/UevQr3zfd_oaAAGn/jquery-ui-tabs

在标签1上,您有

Name
Age

在标签2上,您有

Address
Postcode

然后你有两个域类

Class User {
String name
String age
 Address address

}

Class Address {
  String address1
   String postcode
}

因此,用户具有名称年龄并且也绑定到地址,而地址具有地址1和邮政编码

现在你的控制器动作

def save(MyBean bean) {
  Address address = new Address(bean.loadAddress()).save()

  User user = new User()
  def userMap = bean.loadUser()
  user.age=userMap.age
  user.name=userMap.name
  //The above object that got saved first
  user.addresss=address
  user.save()

  render "hopefully this should have saved it as expected"
}

src/main/groovy/yourPackage/MyBean.groovy

package yourPackage

import grails.validation.Validateable

Class MyBean implements Validateable{

  String name
  String age
  Address address
  String address1
  String postcode

  //Now declare your constraints like your domainClass add validator where required to add additional verification/validation to your objects sent back

  //This will return all the objects required as a map to save address domain class
  protected Map loadAddress() {
    Map results=[:]
    results.with {
      address1=address1
      postcode=postcode
    }
    return results
  }
  //this will return the user object
  protected Map loadUser() {
    Map results=[:]
    results.with {
        name=name
        age=age                      
    }
  }
}

其他相当复杂的验证bean示例: PhotosBean CustomerChatBean ScheduleBaseBean

Other points of reference:

正如我所说的那样,我认为作为一个初学者,这可能需要一段时间来解决问题,但希望提供的内容现在会变得更加清晰

<强> E2A 真的很复杂!!我可以有两个gsp屏幕而不是jquery选项卡

这没有多大意义。

你可以有两个动作,只是将params传递给第二个gsp?

所以

def TestController  {

  def index() {
    render view: page1
  }

  //where page 1 is the first form and submits to action2
  //action2 picks up parmas from page1
  def action2() {
    render view: page2, model:[params:params]
  }
}
在page2.gsp中

你有

<g:form action="action3">
<g:hiddenField name="originalName" value="${params.originalValue}"/>
<g:hiddenField name="originalName2" value="${params.originalValue2}"/>
<g:hiddenField name="originalName3" value="${params.originalValue3}"/>

Then your actual form content

这样做的问题是action2需要验证从page1收到的params吗?如果是这样,它需要渲染原始页面或page2取决于。

提交到第2页后,最终用户可以篡改hiddenFields,因此验证的内容现在可能无效。您将需要某种形式的方法来重新验证所有这些。

使用上面的验证方法,您可以调用validate()函数,或者可以构建一些md5检查初始值与现在从page2发送的内容。

无论哪种方式,如果你不关心验证,只是想看到它的工作,那么上面是最简单的方法。

我可以使用两个gsp屏幕而不是jquery标签

在第1页中,您可以<g:include action="page2">并在第一个包含第二个gsp,但在所有诚实中,第1页可能只包含1个页面中的两个操作。这就是为什么它没有意义