1

我需要一个非常愚蠢的东西,但我被困住了。我基本上需要渲染一个 gsp 页面并将渲染本地保存在我在 web-app/ 下创建的文件夹中的服务器端。

基本上这个输出:

    render(view: "report-test") 

必须保存在文件中,例如在 web-app/report/ 中的文件夹中的示例 report-test.html

有什么好的建议吗?

多谢

更新-解释 非常感谢大家。让我解释一下我正在尝试做的事情,希望有更好的解决方案。我敢打赌,我仍然是 grails 的新手。我正在尝试使用可帮助我创建 pdf 的 print-css 和 Price 软件打印报告。所以我的想法是使用 gsp 动态创建 HTML 文件,并遵循 print-css 规则,然后将其保存在服务器端本地,然后执行创建我的 pdf 文件并将 pdf 文件返回到浏览器。

更新 我需要使用 css 但不能在 html 中使用,而是作为 Price 软件命令的一部分。http://www.princexml.com/ 所以基本上呈现的gps是一个没有应用任何css的html,然后当我运行命令来创建pdf时,我指定要应用的css文件。例如:

     prince -s pdf-styles.css book.html builds/book.pdf

更新/2 - 关闭

感谢shutgunNinja,在下面的帖子中看到他的伪代码,这里是我要使用的代码:

class YourController {
   def printHtml() {
       render(view: "report-test")
   }
   def buildReport() {
        String basePath = applicationContext.getResource("/").getFile().toString()
        def url = new URL("http://localhost:8080/PrjName/report/printHtml)
        def data = url.getText()
        def file = new File("${basePath}/reportFolder/report.html")
        file.createNewFile()
        FileUtils.writeStringToFile(file, data)
    }
}

所以正如shutgunNinja 之前写的,我调用buildReport() 来调用URL 来获取html 文件。我想补充几点建议:

  • 如果您使用某些安全框架(如 spring security)请小心,您必须能够在没有身份验证的情况下调用该页面,否则您会看到登录页面而不是您请求的文件
  • 我添加了存储正确地址的基本路径 var 以访问 web-app 目录
4

2 回答 2

1

渲染完成到 HttpResponse 的输出流。它应该发现为: response.outputStream

您可以做的一件事是将“响应”对象与具有 outputStream = StringOutputStream 或 FileOutputStream 的对象交换。

在对响应 pojo 调用任何类型的“输出”操作之前执行此交换。

更新: 听起来您想要浏览器呈现的输出(因为您希望 css 生效等)。

您无法在服务器上获得这种渲染。可以在此处找到在服务器上创建 PDF 报告的最佳选择:使用 Java 创建 PDF

于 2015-05-14T15:26:08.347 回答
1

好的,我想我理解你想要做什么,我将尝试更详细地解释我在评论中所说的话。我不确定这是否是最好的方法,但如果没有其他选择,我会尝试这样做。

要求:

report()获取渲染 GSP 页面(通过,比如, )的控制器方法(比如,)的输出,render(view: "report-test")并将其保存为服务器上的 HTML 文件。

方法:

  • Preservereport()及其呈现页面的逻辑。
  • 创建另一个控制器方法(例如,buildReport()),它不会自行呈现任何内容,而是转发回其他页面。
  • 让此buildReport()方法获取映射到的任何 URL 的内容report(),并将其保存为文件。

伪代码:

class YourController {
    def report() {
        // Handle input, generate data for populating page
        render(view: "report-test")
    }
    def buildReport() {
        // Indirectly call report(), passing whatever data is needed as URL parameters manually
        def url = new URL("/path/to/action?arg1=" + params.arg1)
        def data = url.getText()
        def file = new File("/web-app/report/report.html")
        file.createNewFile()
        FileUtils.writeStringToFile(file, data)
    }
}

请记住,我没有测试过这段代码来验证它是否有效。几乎绝对需要进行修改,但它应该明白这一点。

编辑:正如 OP 在他们的编辑中提到的,您用于登录过滤的任何安全系统都需要设置为忽略report(),这样您就不会出现登录屏幕。任何重定向过滤器也是如此;无论语言或工具包如何,这种方法通常不适用于 HTTP 重定向或转发。

于 2015-05-14T16:37:11.277 回答