【问题标题】:Skip the rendering of view in grails跳过 grails 中视图的渲染
【发布时间】:2013-06-18 18:20:04
【问题描述】:

在 Grails 中,控制器中的操作应该有一个匹配的 GSP 文件。例如,控制器中的操作list() 将呈现list.gsp。 无论如何我们可以跳过这个吗?假设我想要我的操作:writetoaFile() 只生成一个由客户端浏览器下载的文本文件,然后不呈现视图。 我已经尝试过return、return null 和return false,但都没有成功。我的代码如下:

def writetoaFile(){     
    response.setContentType("text/plain")
    response.setHeader("Content-disposition", "attachment; filename=test.txt")
        response <<"Hello World"
    return
}

writetoafile.gsp的代码:

Hey There. This is a gsp file.

现在我的应用程序成功地将“Hello World”写入文件 test.txt,但它也将 writetoafile.gsp 写入文本文件 test.txt。

所以我的 test.txt 包含:

Hello World
Hey There. This is a gsp file.

我想跳过视图。我试过了:

  1. return
  2. return null
  3. return false
  4. response.setContentType("text/plain")
  5. response.setContentType("")

【问题讨论】:

  • 您不必拥有与每个控制器方法关联的视图。你总是可以(作为控制器的最后一行)做:渲染“一些文本”甚至渲染“”

标签: grails


【解决方案1】:

试试这个代码:

def writetoaFile(){  
    response.setContentType("text/plain")
    response.setHeader("Content-disposition", "attachment; filename=test.txt")
    response <<"Hello World"
    response.flushBuffer()
}

【讨论】:

  • 在 grails 1.3.7 中,response.outputStream &lt;&lt; file.text response.outputStream.flush() 获得了更好的结果
【解决方案2】:

如果您没有通过 ajax 调用您的操作,请尝试返回您的响应。像这样的东西。

def downloadMe ={
    response.contentType = grailsApplication.config.grails.mime.types["excel"]
    def fileName= "text.xlsx'
    response.setHeader("Content-Disposition","attachment; filename=\"" + fileName + "\"")
    return myWrite(response)
}

【讨论】:

    【解决方案3】:
    def writetoaFile(){     
     //Do whatever
        render ""
    }
    

    这会呈现一个空白页面。如果你想要一些文本,你可以把它放在渲染语句中。

    【讨论】:

    • 嗨,BZ,感谢您的回复,但我无法使用渲染,因为我正在根据某些逻辑动态生成文本文件。
    • 那么您要做的是生成文件,将其写入文件系统然后渲染它?您希望文件看起来像一个页面吗?或者您是否希望提示查看器将其保存为文件等?
    • 如果你只想渲染文件:你可以做 File t = new File(path/to/file);render t.text
    • 我不想渲染文件。我只是想让它下载到文件系统。浏览器必须提示保存为文件
    【解决方案4】:

    尝试以下方法之一(1 和 2,或 1 和 3)

    1) 显式输出流(可能不是必需的,但试一试)

    response.outputStream << "Hello world"
    

    2) 您可以检索 GrailsWebRequest 和 disable view rendering.

    def webRequest = request.getAttribute(GrailsApplicationAttributes.WEB_REQUEST)
    webRequest.setRenderView(false) 
    

    3) Use a filter 并在 after->model 闭包中返回 false 以禁用默认视图渲染。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 2012-02-28
      • 2016-09-08
      相关资源
      最近更新 更多