Nesse post demonstro como intregrar uma aplicação Web desenvolvida pelo Spring MVC com o JasperReports para emissão de relatórios. A integração entre o Spring MVC e JasperReports não tem nenhuma relação com o Spring Roo, mas para facilitar a criação e o desenvolvimento do projeto vou assumir o uso do Spring Roo.
Dependências
Além da biblioteca do JasperReports, dependendo do caso precisamos de outras libs complementares:
- Spring Support
- iText (pdf)
- POI (xls)
A seguir o trecho do pom.xml (Maven) com configuração dos artefatos. No trecho abaixo também coloco as configurações para o plugin do Maven que automatiza a compilcação dos relatórios jrxml para o formato jasper, utilizado pelo JasperReports:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | ... < dependency > < groupId >org.springframework</ groupId > < artifactId >spring-context-support</ artifactId > < version >${spring.version}</ version > </ dependency > < dependency > < groupId >net.sf.jasperreports</ groupId > < artifactId >jasperreports</ artifactId > < version >4.0.0</ version > </ dependency > < dependency > < groupId >com.lowagie</ groupId > < artifactId >itext</ artifactId > < version >2.1.7</ version > < scope >compile</ scope > </ dependency > < dependency > < groupId >org.apache.poi</ groupId > < artifactId >poi</ artifactId > < version >3.6</ version > < scope >compile</ scope > < optional >true</ optional > </ dependency > ... < plugin > < groupId >org.codehaus.mojo</ groupId > < artifactId >jasperreports-maven-plugin</ artifactId > < configuration > < sourceDirectory >src/main/webapp/WEB-INF/reports</ sourceDirectory > < outputDirectory >src/main/webapp/WEB-INF/reports</ outputDirectory > </ configuration > < executions > < execution > < goals > < goal >compile-reports</ goal > </ goals > </ execution > </ executions > < dependencies > < dependency > < groupId >jasperreports</ groupId > < artifactId >jasperreports</ artifactId > < version >3.5.3</ version > </ dependency > < dependency > < groupId >org.apache.log4j</ groupId > < artifactId >com.springsource.org.apache.log4j</ artifactId > < version >1.2.15</ version > </ dependency > </ dependencies > </ plugin > ... |
Próxima etapa é configurar no xml do MVC (webmvc-config.xml) o viewResolver do Spring que indica o properties com as configurações de cada relatório.
1 2 3 4 | < bean id = "viewResolver" class = "org.springframework.web.servlet.view.ResourceBundleViewResolver" > < property name = "basename" value = "relatorios" /> </ bean > |
O arquivo relatorios.properties (na raiz do diretório de classes) armazena qual a classe que estipula o formato de geração do relatório, a url com o caminho do arquivo do relatório.
No exemplo estou usando o arquivo compilado, o .jasper, mas o Spring aceita a extensão jrxml. A propriedade reportKeyData (opcional) indica o apelido para o DataSource com os dados que o relatório depende. Já o valor relatorioPedidos usado como base das 3 chaves é o identificador do relatório, usamos no retorno do método da Controller que processa o relatório.
1 2 3 4 | relatorioPedidos.(class)= org.springframework.web.servlet.view.jasperreports.JasperReportsMultiFormatView relatorioPedidos.url=/WEB-INF/reports/pedidos.jasper relatorioPedidos.reportDataKey=pedidosDS |
A classe JasperReportsMultiFormatView é indicada em relatórios que podem ser emitidos em mais de um formato, ou seja, o mesmo relatório gerado em xls e pdf. Outra alternativa seria utilizar JasperReportsPdfView, nesse caso a emissão ocorre só em pdf.
Pra fechar o método da Controller que processa os dados para emissão do relatório:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ... @RequestMapping ( "/report" ) @Controller public class ReportController { @RequestMapping (value = "/pedido/pdf" , method = RequestMethod.GET) public String processaRelatorioPedidos( @RequestParam String de, @RequestParam String ate, ModelMap modelMap) { JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(Pedido.findPedidosByDataGeracao(de, ate), false ); modelMap.put( "pedidosDS" , ds); return "relatorioPedidos" ; } } |
A documentação oficial do Spring disponibiliza um capítulo sobre a integração do Spring MVC com o JasperReports.
@edermag
www.yaw.com.br
1 comment:
gostei do exemplo, trabalhei um pouco com o ROO, vou tentar implementar algum relatório agora
Post a Comment