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

Grails 将GSP页面呈现到web app子文件夹中的文件,grails,grails-2.0,print-css,Grails,Grails 2.0,Print Css,我需要一个非常愚蠢的东西,但我被卡住了。 我基本上需要呈现一个gsp页面,并将呈现保存在服务器端的本地文件夹中,该文件夹是我在web app/下创建的 基本上,这个系统的输出: render(view: "report-test") 必须作为示例report-test.html保存在web app/report中的文件夹中/ 有什么好建议吗 非常感谢 更新-解释 谢谢大家。让我解释一下我想做什么,希望有更好的解决办法。我敢打赌,我还是grails的新手。 我正在尝试使用打印css和P

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

基本上,这个系统的输出:

    render(view: "report-test") 
必须作为示例report-test.html保存在web app/report中的文件夹中/

有什么好建议吗

非常感谢

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

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

     prince -s pdf-styles.css book.html builds/book.pdf
更新/2-关闭

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

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)
    }
}
正如Shutgunnija之前写的,我调用buildReport(),它调用URL来获取html文件。我想补充几点建议:

  • 如果您使用的是一些安全框架,比如spring security,那么您必须能够在没有身份验证的情况下调用该页面,否则您将看到一个登录页面,而不是您请求的文件
  • 我添加了basepath变量,在其中存储了访问web应用程序目录的正确地址

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

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

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

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


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

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

要求: 获取控制器方法(例如,
report()
)的输出,该方法呈现GSP页面(例如,
render(view:“report test”)
)并将其保存为服务器上的HTML文件

方法:
  • 保留
    report()
    及其呈现页面的逻辑
  • 创建另一个控制器方法(例如,
    buildReport()
    ),该方法本身不呈现任何内容,而是转发回其他页面
  • 让此
    buildReport()
    方法获取映射到
    report()
    的任何URL的内容,并将其保存为文件
伪代码: 请记住,我没有测试这段代码来验证它是否有效。修改几乎是绝对需要做的,但它应该让人明白这一点


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

出于好奇,为什么需要使用这种方法,而不是使用可以请求和填充的动态页面?也就是说,如果需要使用这种方法,有一件事是可行的(尽管这可能不是最佳实践)是设置一个控制器方法来填充该页面,然后按照所述从控制器方法URL手动获取页面,然后再按照所述将页面内容写入一个文件。看起来是这样,但事实并非如此。您必须提供一个html文件和一个css文件来为软件定价,这将实现此技巧,例如此代码创建一个pdf:prince-s pdf-styles.css book.html builds/book.pdfOh,很好。是的,我忘了在内部调用时确保操作绕过了用于安全性的任何内容。我在过去为自动生成报告时遇到过这个问题。很好!
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)
    }
}