将 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 文件。我想补充一些建议:
- 如果您正在使用某些安全框架,例如 spring 安全,请小心,您必须能够在未经授权的情况下调用该页面,否则您看到的不是您请求的文件,而是登录页面
- 我添加了基本路径变量,我在其中存储了访问 web-app 目录的正确地址
对 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 重定向或转发,无论语言或工具包如何。
我需要一个非常愚蠢的东西,但我被卡住了。 我基本上需要渲染一个 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 文件。我想补充一些建议:
- 如果您正在使用某些安全框架,例如 spring 安全,请小心,您必须能够在未经授权的情况下调用该页面,否则您看到的不是您请求的文件,而是登录页面
- 我添加了基本路径变量,我在其中存储了访问 web-app 目录的正确地址
对 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 重定向或转发,无论语言或工具包如何。