Как передать информацию о подключении к базе данных и параметры запроса из контроллера в JasperReportsMultiFormatView

Я создаю прототип веб-приложения, используя Spring MVC 3.0 с JasperReports. Я уже делал приложения для создания отчетов, используя Spring + Jfreechart + iText + Apache POI и смог успешно использовать соответствующие классы представления, предоставляемые Spring, для потоковой передачи pdf, xls и изображений.

На этот раз я хочу попробовать использовать JasperReports, чтобы я мог создавать свои pdf-файлы вне приложения и не беспокоиться о знании базового api (будь то jfreechart, itext или poi).

Проблема

У меня есть файл report1.jrxml, который содержит тег queryString с моим запросом с двумя параметрами даты. Когда я тестирую отчет через iReport, он успешно компилируется и запускается. Здесь проблем нет.

Теперь я читаю раздел JasperReports из следующей документации Spring http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#view-jasper-reports и пытаюсь заставить 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();

Что мне нужно

Мне нужно достичь того, что описано выше, используя классы Spring, такие как JasperReportsPdfView, JasperReportsXlsView или даже лучше JasperReportsMultiFormatView

Итак, вкратце мне нужно иметь возможность передавать следующее из моего контроллера в jasper report:

  1. Параметры
  2. Информация о подключении к БД, чтобы queryString внутри jasper знал, с кем работать

Вот что у меня есть, а на выходе пустой 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);
}
}

6
задан Viriato 12 October 2011 в 04:33
поделиться