Introducción
El implementar un reporte de JasperReport dentro de un JSF es posible, si bien hay que tener en cuenta ciertas consideraciones, se puede realizar con éxito dicho desarrollo.
Definiciones
JasperReport: Herramienta para creación de informes en Java, ver http://es.wikipedia.org/wiki/JasperReports
JSF: JavaServer Faces (JSF) es un framework para aplicaciones Java basadas en web
http://es.wikipedia.org/wiki/JavaServer_Faces
Herramientas utilizadas
Eclipse: Para mí el mejor IDE de programación Java www.eclipse.org
iReport: Excelente herramienta para la creación de los reportes de JaspeReport, sencillo y potente. http://jasperforge.org/plugins/project/project_home.php?group_id=83
MySQL: Como motor de base de datos http://www.mysql.com/.
Manos a la obra
Como primer paso se debe tener en cuenta, que para el desarrollo de aplicaciones Desktop en Java NO es necesario seguir este tutorial o ayuda, ya que lo que voy a explicar a continuación se aplica solamente a la dificultad de la implementación en Web (JSF).
Diseño del reporte
Para el diseño del reporte debemos abrir el iReport y crear un nuevo reporte y guardarlo, luego se debe compilar (Build – Compile) y además ejecutar (Build – execute (empty data source), de esta manera obtenemos todos los archivos necesarios para utilizarlos desde Java.
Desarrollo
En ésta parte, voy a detallar las clases que vamos a necesitar para implementar un reporte en JSF.
Clases necesarias
- AbstratcBaseReportBean.java, esta clase es la ancestra de los Reportes a crear. Posee el acceso al archivo del diseño entre otras utilidades.
- ReportConfigUtil.java, posee procedimientos para exportar y compilar archivos.
- ReportesBean.java, es la clase que contendrá el Reporte en cuestión, como particularidad les comento que hereda de AbstractBaseReportBean.
- ReportesTicketsDataSource.java, es la clase que obtiene los datos a mostrar. En este ejemplo vamos a obtener un listado de tickets.
- Reporte.java, es la clase a utilizar con el jsp.
- ReporteTicket.jsp, es el jsp (presentación) que muestra el reporte en cuestión.
AbstractBaseReportBean
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
|
package reporte.bean.common; […] import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.j2ee.servlets.BaseHttpServlet; import reporte.util.ReportConfigUtil; public abstract class AbstractBaseReportBean { public enum ExportOption {PDF, HTML, EXCEL, RTF} private ExportOption exportOption; private final String COMPILE_DIR = "/Reportes/"; public AbstractBaseReportBean() { super(); setExportOption(ExportOption.HTML); } […]
|
ReportesBean
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
|
package reporte.bean.report; import java.util.Calendar; […] import net.sf.jasperreports.engine.JRDataSource; import reporte.bean.common.AbstractBaseReportBean; public class ReportesBean extends AbstractBaseReportBean { private final String COMPILE_FILE_NAME = "ReporteTicket"; private Date fechaDesde; private Date fechaHasta; private String mensaje; public ReportesBean() { super(); fechaDesde = Calendar.getInstance().getTime(); fechaHasta = Calendar.getInstance().getTime(); } […]
|
ReportConfigUtil
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
|
package reporte.util; import java.io.File; import java.io.PrintWriter; import java.util.Map; import javax.servlet.ServletContext; import net.sf.jasperreports.engine.JRAbstractExporter; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.export.JRHtmlExporter; import net.sf.jasperreports.engine.export.JRHtmlExporterParameter; public class ReportConfigUtil { /* * PRIVATE METHODS */ private static void setCompileTempDir (ServletContext context, String uri) { System.setProperty("jasper.reports.compile.temp", context.getRealPath(uri)); } /* * PUBLIC METHODS */ public static boolean compileReport (ServletContext context, String compileDir, String filename) throws JRException { String jasperFileName = context.getRealPath(compileDir + filename +".jasper"); File jasperFile = new File(jasperFileName); if(jasperFile.exists()) { return true; } try { setCompileTempDir(context, compileDir); String xmlFileName = jasperFileName.substring(0, jasperFileName.indexOf(".jasper"))+".jrxml"; JasperCompileManager.compileReportToFile(xmlFileName); return true; }catch(Exception e) { e.printStackTrace(); return false; } } […]
|
ReportesTicketsDataSource
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
|
package reporte.bean.report; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.Iterator; import java.util.Vector; import dominio.DataReporteTicket; import dominio.Ticket; import dominio.Transaccion; import proxy.FachadaSis; import net.sf.jasperreports.engine.JRDataSource; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRField; public class ReporteTicketsDataSource implements JRDataSource { private Object[][] data; //{{"","",new Date(),new Date(),"",new Double(0)}}; private int index = -1; public ReporteTicketsDataSource(Date fechaDesde, Date fechaHasta) throws Exception { super(); cargarData(fechaDesde, fechaHasta); } private void cargarData(Date fechaDesde, Date fechaHasta) throws Exception { // TODO Auto-generated method stub FachadaSis fachada = FachadaSis.darInstancia(); ArrayList<DataReporteTicket> tickets = fachada.obtenerReporteTickets(fechaDesde, fechaHasta); Iterator<DataReporteTicket> it = tickets.iterator(); Vector<Object[]> tics = new Vector<Object[]>(); while (it.hasNext()){ DataReporteTicket ti = it.next(); Object[] ticket = {ti.getTransaccion(),ti.getCodigo(),ti.getHoraInicio() ,ti.getHoraFin(),ti.getMatricula(), ti.getImporte()}; tics.add(ticket); //} } data = new Object[tics.size()][6]; for(int i = 0;i<tics.size();i++){ data[i] = tics.get(i); } } […]
|
Reporte
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 54 55 56 57 58 59 60 61
|
package web; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.TimeZone; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.view.JasperViewer; public class Reporte { private static Connection conn = null; private Date fechadesde; private Date fechahasta; private String mensaje; public Reporte(){ fechadesde = Calendar.getInstance(TimeZone.getDefault()).getTime(); fechahasta = Calendar.getInstance(TimeZone.getDefault()).getTime(); mensaje = ""; } […]
|
Como se ve en el código, básicamente lo que se necesita es establecer un mini Framework mediante las clases que se detallaron anteriormente. El jsp solamente acepta los parámetros y se ejecuta el método execute() de la clase ReporteBean.
Espero que les sea de ayuda y además les dejo todas las clases y las jsp en el siguiente archivo EjemploJasperReportJSF.zip
Si te ha gustado este artículo y si crees que lo que está escrito vale la pena compartirlo, entonces compártelo con la comunidad que prefieras mediante los links que están debajo.
Gracias por visitarnos.
|