将 GSP 页面渲染到 web-app 子文件夹中的文件

Render a GSP page to a file in a web-app subfolder

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

基本上这个输出:

    render(view: "report-test") 

必须保存在一个文件中,例如报告-test.html 在位于 web-app/report/

的文件夹中

有什么好的建议吗?

非常感谢

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

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

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

UPDATE/2 - 关闭

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

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 文件。我想补充一些建议:

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

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

在对响应 pojo 调用任何类型的 "output" 操作之前执行此交换。

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

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

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

要求:

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

方法:

  • 保留 report() 及其呈现页面的逻辑。
  • 创建另一个 Controller 方法(例如,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)
    }
}

请记住,我尚未测试此代码以验证其是否有效。几乎绝对需要进行修改,但它应该能说明问题。

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