【问题标题】:Transferring data from one grails action to another将数据从一个 grails 操作传输到另一个
【发布时间】:2011-03-25 23:54:44
【问题描述】:

对于我们的 grails 应用程序,我编写了一个方法,可以让您上传一个包含联系人的 CSV 文件,它会解析文件并根据数据创建联系人。我使用了自己的测试文件(硬编码哪些字段意味着什么),效果很好。

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

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

我是一个 grails 新手,所以我不确定什么是 hackish,什么是优雅的。你会怎么做?

【问题讨论】:

  • 如果您不需要保留地图信息,为什么要将其存储在任何地方?将参数保存在映射中,以便您知道如何将数据映射到列。
  • 是的,但是如果我们不存储 CSV 的数据,我们就必须上传和解析两次:一次是提取标题,一次是根据用户的选择来处理它。有点丑。

标签: design-patterns grails groovy


【解决方案1】:
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】:

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

    【讨论】:

      【解决方案3】:

      阅读您的问题时首先想到的是Grails Web Flows。这些基于Spring Web Flow project 并使得实现向导式视图序列变得非常容易。将它们视为状态机。您还可以使用流范围保存流中“步骤”之间的状态。

      【讨论】:

      • 流范围是带有会话引用的请求。如果没有正确清理,在这些范围内保存大量数据会降低应用程序的性能。我认为仅将网络流用于两步操作是相当过度设计的
      【解决方案4】:

      我同意 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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-19
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多