代码之家  ›  专栏  ›  技术社区  ›  bechbd

将数据从一个Grails动作传输到另一个Grails动作

  •  1
  • bechbd  · 技术社区  · 5 年前

    对于我们的Grails应用程序,我编写了一个方法,允许您上传一个充满联系人的csv文件,它将解析该文件并从数据中创建联系人。我已经使用了自己的测试文件(硬编码,哪个字段代表什么),它工作得很好。

    但是当然,我不能将字段引用硬编码,所以我的下一步是向用户显示一个屏幕,让他们将文件中的列映射到我们的数据库字段(列A和B保留名称,列C保留电子邮件等)。

    我的问题: 临时存储我在第一部分提取的数据的最佳方法是什么,以便在第二部分结束时使用它?域类似乎是合乎逻辑的选择,但我还没有找到一种优雅的方法来实现这一点。Hibernate似乎不喜欢二维字符串数组,要以面向对象的方式实现它,需要几个域类(importedcsv、csvrow)。对于这样一个小的临时进程,有几个顶级的域类可以接受吗?

    我有点像格雷尔斯的新手,所以我不知道什么是黑客,什么是优雅。你会怎么做?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Aaron Saunders    14 年前
    upload the file in the first action
    store a blob in db 
    parse the columns out display ui to map column to fields 
    second action read the blob from db, create new domain objects, delete blob from db
    

    我认为在会话中存储csv文件可能会导致一些问题。

        2
  •  0
  •   Jared    14 年前

    将数据存储在会话对象中。您可以在会话中存储大多数任意数据,如字符串数组或哈希映射。只要用户使用的Web应用程序的超时时间大约为30分钟,它就可以持续,尽管可以根据需要增加或减少超时时间。一旦用户停止使用Web应用程序,会话将超时并过期。如果在用户处理完应用程序后不需要保留数据,这可能是最简单的方法。

        3
  •  0
  •   Daniel Rinser    14 年前

    阅读你的问题时首先想到的是 Grails Web Flows . 这些是基于 Spring Web Flow project 并使实现向导样式的视图序列变得非常容易。把它们想象成一个状态机。还可以使用流作用域在流中的“步骤”之间保存状态。

        4
  •  0
  •   Javid Jamae    14 年前

    我同意Aaron Saunders的观点,并建议您将其存储在数据库中。这将允许您保存用户状态,以防他们的会话超时。

    使用多部分表单上载文件,然后按如下方式导出文件:

    def uploadedFile = request.getFile( 'image' )
    csvDomainInstance.csvFile = uploadedFile.bytes
    

    您的域对象可能如下所示:

    class ContactCsvFile {
      byte[] csvFile
      static constraints = {
        csvFile( nullable:true, maxSize:2097152 ) //2MB
      }
    }
    

    然后,要读取它,请执行如下操作(未测试):

    def file = new File()
    file.setBytes( csvDomainInstance.csvFile )
    def csvText = file.getText()