2012-09-11 46 views
1

如您所知,在使用集成JasperReports views和Spring時,xml文件中的報告數據密鑰只需要一個密鑰,我將在下面進行演示。但是如果我有多個鍵,事實上我無法確定將要在我的地圖中顯示的對象的數量。將JasperReports與Spring集成

我該如何解決這個問題?

這是我的碧玉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的對象,我會傳遞給視圖的服務。

@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確定的。