如您所知,在使用集成 JasperReports 视图和 Spring 时,xml文件中的报告数据键只需要一个密钥,我将在下面进行说明。但是,如果我有多个键,事实上我无法确定将在我的地图中的对象数量。
我该如何解决这个问题?
这是我的jasper-views.xml
<bean id = "toPdf"
class = "org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView"
p:url= "classpath:src/newpackage/tcoReport.jasper"
p:reportDataKey="dSource"
/>
答案 0 :(得分:0)
我建议你实现自己的PdfView。
我会证明:
public class JasperPdfView extends AbstractView {
public JasperPdfView(){
setContentType("application/pdf");
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response)
throws Exception {
final JasperPrint print = (JasperPrint)model.get("jasper_print");
JasperExportManager.exportReportToPdfStream(print, response.getOutputStream());
}
}
我有一个服务可以创建我的JasperReport对象,我将传递给View。
@Override
public JasperPrint generate(ReportContext ctx) throws SQLException {
Resource res = resourceLoader.getResource(ctx.getFile());
JasperReport report = JasperCompileManager.compileReport(res.getInputStream());
HashMap<String, Object> map = Maps.newHashMap();
map.putAll(ctx.getParams());
map.put("from", ctx.getFrom().toDate());
map.put("to", ctx.getTo().toDate());
JasperPrint print = JasperFillManager.fillReport(report, map, dataSource.getConnection());
return print;
}
我的Controller生成调用服务并将JasperReport放在模型上。
@RequestMapping(value = "/{reportName}")
public void printReport(@PathVariable final String reportName, final ParameterForm form, final ModelMap model)
throws SQLException {
final ReportContext ctx = reports.get(reportName).build();
ctx.setFrom(form.getFrom());
ctx.setTo(form.getTo());
ctx.getParams().put("customerId",form.getCustomerId());
model.put("jasper_print", reportService.generate(ctx));
}
JapserPdfView是通过ContentNegotiatingViewResolver确定的。