我需要一个非常愚蠢的事情,但我被困住了。 我基本上需要渲染一个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文件。我想补充一些建议:
答案 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()
及其呈现页面的逻辑。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重定向或转发方面通常都不会很好。