使用Grails控制器生成PDF之前验证数据是否存在
问题描述:
我没有使用PDF插件。我只是使用Jasper的Java API。一切工作正常。 PDF将在单独的窗口中打开。我遇到的问题是,当没有找到数据时,它仍会在浏览器中打开一个空白标签。我想拦截这个,并显示一条消息,而不是没有数据,但没有我试过的工作。使用Grails控制器生成PDF之前验证数据是否存在
这里是从控制器的代码片段:
projAccomps = projAccomps.findAll { ProjectAccomplishment pa ->
pa.workDate >= startDate && pa.workDate <= endDate
}
// I'd like to be able to check right here for no data
// and send back a message instead
//
// if (projAccomps.size() < 1) ...
JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(projAccomps)
String jasperFile =
grailsApplication.mainContext
.getResource('reports/accomplishment-listing.jasper')
.file
.getAbsoluteFile()
// Report parameter
Map<String, String> reportParam = new HashMap<String, String>()
String projectQuery = "All projects"
String dateRange = ""
Boolean allProjects = true
if (params.project) {
projectQuery = project.name
allProjects = false
}
if (params.startDate) {
dateRange = startDate.format('MM/dd/yyyy')
}
if (params.endDate) {
dateRange += " - " + endDate.format('MM/dd/yyyy')
}
String reportCriteria = "Work Order: ${wo.workOrderNumber}, Project(s): ${projectQuery}, Dates: ${dateRange}"
reportParam['report_criteria'] = reportCriteria
reportParam['all_projects'] = allProjects
JasperPrint print = JasperFillManager.fillReport(jasperFile, reportParam, ds);
byte[] bytes = JasperExportManager.exportReportToPdf(print)
render(file: bytes, contentType: 'application/pdf')
我试过Jquery.ajax和想抓PDF数据或功能成功的消息,但是这是一个灾难。
任何人有任何想法如何做到这一点?
答
在控制器的行动有几种方法来创建响应,例如重定向或呈现出的情况下将其公开是有道理的使用重定向,然后返回
我认为这应该工作
// ... get projAccomps data
if (!projAccomps) {
flash.message "No result between $startDate and $endDate"
redirect uri: '/some/url'
return
}
// ... render pdf logic
还有就是你可以使用制造商创建的PDF或Word文档库中,我分享链接,如果你想尝试替代碧玉
+0
除了提交参数的表单具有导致立即打开新选项卡/窗口的target =“_ blank”这一事实之外,这确实起作用。这是一项要求。另外,我在这个页面上有很多ajax,并且希望'空'的消息只出现在类似于flash.message的页面上,但是不能以'成功'获取PDF数据,功能,然后以某种方式渲染它使这很困难。 –
以上是通过ajax调用的吗? –