Grails 将GSP页面呈现到web app子文件夹中的文件
我需要一个非常愚蠢的东西,但我被卡住了。 我基本上需要呈现一个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
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应用程序目录的正确地址
response.outputStream
您可以做的一件事是将“response”对象与outputStream=StringOutputStream或FileOutputStream的对象交换
在对响应pojo调用任何类型的“输出”操作之前,请执行此交换
更新:
听起来您希望浏览器呈现的输出(因为您希望css生效,等等)
您无法在服务器上获得这种渲染。您在服务器上创建PDF报告的最佳选择可以在此处找到:好的,我想我理解您的意图,我将尝试更详细地解释我在评论中所说的内容。我不确定这是否是最好的方法,但如果没有其他选择,我会尝试这样做 要求: 获取控制器方法(例如,
report()
)的输出,该方法呈现GSP页面(例如,render(view:“report test”)
)并将其保存为服务器上的HTML文件
方法:
- 保留
及其呈现页面的逻辑report()
- 创建另一个控制器方法(例如,
),该方法本身不呈现任何内容,而是转发回其他页面buildReport()
- 让此
方法获取映射到buildReport()
的任何URL的内容,并将其保存为文件report()
编辑:正如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)
}
}