将GSP页面呈现到web-app子文件夹中的文件

时间:2015-05-14 15:19:30

标签: grails grails-2.0 print-css

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

基本上是这个的输出:

    render(view: "report-test") 

必须保存在文件中,例如在web-app / report /

中找到的文件夹中的report-test.html

有什么好建议吗?

非常感谢

更新 - 说明 非常感谢大家。让我解释一下我正在尝试做什么,希望有更好的解决方案。我打赌有,我仍然是grails的新手。 我正在尝试使用print-css和Price软件打印报告,帮助我创建一个pdf。 所以我的想法是使用gsp动态创建HTML文件,然后按照print-css规则然后在服务器端本地保存它,然后执行创建我的pdf文件的命令(使用Price)并将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安全性),请务必小心,您必须能够在没有auth的情况下调用该页面,否则您将看到登录页面而不是您请求的文件
  • 我添加了存储正确地址的basepath var以访问web-app目录

2 个答案:

答案 0 :(得分:1)

渲染是对HttpResponse的输出流进行的。它应该是:response.outputStream

您可以做的一件事是将'response'对象与outputStream = StringOutputStream或FileOutputStream交换。

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

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

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

答案 1 :(得分:1)

好的,我想我明白你要做的是什么,我会试着更详细地解释一下我在评论中所说的内容。我不确定这是否是最好的方法,但我会尝试没有其他选择。

要求:

获取Controller方法的输出(例如report()),该方法呈现GSP页面(例如,通过render(view: "report-test"))并将其保存为服务器上的HTML文件。

方法:

  • 保留report()及其呈现页面的逻辑。
  • 创建另一个Controller方法(比如buildReport()),该方法不会自行呈现任何内容,而是转发回其他页面。
  • 让此buildReport()方法获取任何网址映射到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(),以便您不要; t以登录界面结束。任何重定向滤波器都是如此;无论语言或工具包如何,这种方法在HTTP重定向或转发方面通常都不会很好。