如何将数据库连接信息和查询参数从控制器传递到JasperReportsMultiFormatView

Vir*_*ato 6 spring-mvc jasper-reports

我正在使用带有JasperReports的Spring MVC 3.0对Web应用程序进行原型设计.我已经使用Spring + Jfreechart + iText + Apache POI完成了报告应用程序,并且能够成功使用Spring提供的各个视图类来传输pdf,xls和图像.

这次我想尝试使用JasperReports,以便我可以在应用程序之外设计我的pdf,而不必担心知道底层api(是jfreechart,itext或poi).

问题

我有一个report1.jrxml文件,其中包含一个queryString标记,其中包含带有两个日期参数的查询.当我通过iReport测试报告时,它会编译并成功运行.这里没问题.

现在我正在阅读以下Spring文档中的JasperReports部分http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#view-jasper-报告 ,我试图让JasperReportsMultiFormatView正常工作,但有一件我不理解:

  1. JasperReportMultiFormatView如何知道要连接的数据库(回想一下,我在报告中嵌入了查询)?

  2. 文档声明在视图中使用reportDataKey属性,但我不知道这是如何解决我的问题.

  3. 你如何传递参数?

可以做些什么

JaperReports提供了一组xxxManager对象,负责编译,过滤和导出报告.您可以创建一个实现Spring View接口的自定义类,并执行以下操作:

Connection connection;
ServletOutputStream servletOutputStream = response .getOutputStream();
InputStream reportStream = getServlet().getServletConfig().getServletContext().getResourceAsStream("/reports/report1.jasper");
response.setContentType("application/pdf");
Class.forName("com.mysql.jdbc.Driver");
 connection = DriverManager.getConnection("jdbc:mysql://localhost: 
             3306/flightstats?user=user&password=secret");
JasperRunManager.runReportToPdfStream(reportStream,  
                 servletOutputStream, new HashMap(), connection);
connection.close();
servletOutputStream.flush();
servletOutputStream.close();
Run Code Online (Sandbox Code Playgroud)

我需要的

我需要完成上面那些利用Spring类的代码,比如JasperReportsPdfView,JasperReportsXlsView,甚至更好的JasperReportsMultiFormatView

总而言之,我需要能够将以下内容从我的控制器传递给jasper报告:

  1. 参数
  2. Db连接信息,以便jasper中的queryString知道对谁运行

这是我所拥有的,输出是一个空白的PDF文档,我假设因为它不知道如何运行查询

@RequestMapping("/reports/**")
@Controller

public class ReportsController {

@RequestMapping(value ="/reports/usage/report", method = RequestMethod.GET)
public ModelAndView handleSimpleReportMulti(HttpServletRequest request, HttpServletResponse response) throws Exception {

    System.out.println("Made it here");

    Map model = new HashMap();
    //model.put("format", "pdf");
    model.put("START_DATE", new String("09-12-2011"));
    model.put("END_DATE", new String("09-17-2011"));

    return new ModelAndView("report1", model);
}
}
Run Code Online (Sandbox Code Playgroud)

Vir*_*ato 8

我找到了问题的答案.我已将上面的控制器更改为:

@RequestMapping(value ="/reports/usage/report/{format}", method = RequestMethod.GET)
public ModelAndView handleSimpleReportMulti(ModelMap modelMap, @PathVariable("format") String format) throws Exception {

    //Map model = new HashMap();
    modelMap.put("format", format);
    modelMap.put("REPORT_CONNECTION", dataSource.getConnection());
    modelMap.put("START_DATE", new String("09-12-2011"));
    modelMap.put("END_DATE", new String("09-17-2011"));

    return new ModelAndView("report1", modelMap);       
}
Run Code Online (Sandbox Code Playgroud)

我已将view.properties更改为:

#report1(class)=org.springframework.web.servlet.view.jasperreports.JasperReportsPdfView
report1(class)=org.springframework.web.servlet.view.jasperreports.JasperReportsMultiFormatView
report1.url=/WEB-INF/reports/report1.jasper
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.

谢谢