MENTES en MOVIMIENTO Java Web Development._ Ireports, Netbeans, JavaBeans Data Sources

download MENTES en MOVIMIENTO Java Web Development._ Ireports, Netbeans, JavaBeans Data Sources

of 12

Transcript of MENTES en MOVIMIENTO Java Web Development._ Ireports, Netbeans, JavaBeans Data Sources

MENTES EN MOVIMIENTO Java web development.: ireports, netbeans,...

http://mentes-enmovimiento.blogspot.com/2008/05/ireports-netbeans-jav...

1 de 12

14/05/2011 01:11 p.m.

MENTES EN MOVIMIENTO Java web development.: ireports, netbeans,...

http://mentes-enmovimiento.blogspot.com/2008/05/ireports-netbeans-jav...

2 de 12

14/05/2011 01:11 p.m.

MENTES EN MOVIMIENTO Java web development.: ireports, netbeans,...

http://mentes-enmovimiento.blogspot.com/2008/05/ireports-netbeans-jav...

2. ahora crearemos las clases que mostraremos en el reporte. pongo la imagen del diagrama UML y posteriormente el codigo de las clases.

NATIONAL GEOGRAPHIC POD

POD - Costumed performers participate in the Tenjin Matsuri festival

FEEDS

Entradas Comentarios

3.- ok ya que tenemos las clases diseadas implementamos el codigo que es necesario para generar los reportes. NOTA, aun cuando en la documentacion y en algunos manuales se pide que el metodo que envia la lista de beans al reporteador sea estatico [en este caso createBeanCollection], aqui no se realizara de ese manera ya que en lo personal me genera muchos problemas para su implementacion ya que si quiero utilizar variables no estaticas dentro de ese metodo se obtiene el error "no-static varibles cannot be referenced by a static method". y segun he revisado en los foros de discucion esto da pie a un mal diseo ya que te acarrea problemas de concurrencia (un metodo estatico pertenece a la clase no a la instancia de la clase)

unicamente como comentario de lo anterior, si deseas probar el reporte con el metodo estatico esta bien, no tendras ningun problema unicamente agregale el modificador static al metodo para que te quede de la sig manera. public static List createBeanCollection() { //codigo } esto te servira para poder probar el reporte dentro del entorno de ireports, esto significa que dentro del mismo diseador podras ver tus datos. posteriormente si deseas agregarle un origen de datos dinamico quitale el estatic compila de nuevo pero no ejecutes el reporte en el diseador de ireport, ejecutalo en tu aplicacion, adelante veremos como se lleva a

3 de 12

14/05/2011 01:11 p.m.

MENTES EN MOVIMIENTO Java web development.: ireports, netbeans,...

http://mentes-enmovimiento.blogspot.com/2008/05/ireports-netbeans-jav...

cabo.

package com.ireport; import java.util.ArrayList; import java.util.Date; import java.util.List; public class ReporteRecepciones { private Date fechaRecepcion; public Date getFechaRecepcion() { return fechaRecepcion; } public void setFechaRecepcion(Date fechaRecepcion) { this.fechaRecepcion = fechaRecepcion; } public ReporteRecepciones () { } /** * nota, aun cuando en la documentacion y en algunos manuales se pide que * este metodo sea estatico, aqui no se realizara de ese manera. * puedes agregarle el static andtes de List para probar el reporte stand-alone * o sea dentro del diseador de ireports, ya que si el metodo no es estatico * al momento de probarlo te generara un error de NullPointerException, una * vez que comprobado que funciona quitaselo y compilalo de nuevo. * @param fechaRecepcion * @return */ public List createBeanCollection() { List productos = new ArrayList(); List recepciones = new ArrayList(); Recepcion recepcion = new Recepcion(); Almacenista almacenista1 = new Almacenista(); Producto productoA = new Producto(); Producto productoB = new Producto(); almacenista1.setClave("PPELF"); almacenista1.setNombre("PEDRO PARAMO"); productoA.setClave("1000"); productoA.setDescripcion("CAJA BLANCA"); productoA.setId(1); productoA.setMarca("DESCONOCIDA"); productoA.setModelo("INDUSTRIAL"); productoB.setClave("150"); productoB.setDescripcion("ENVASES DE PLASTICO"); productoB.setId(2); productoB.setMarca("BENDER"); productoB.setModelo("GALACTICO"); recepcion.setClave("CLAVE RECEPCION"); recepcion.setFactura("PPPROOO3"); recepcion.setRecibe(almacenista1); recepcion.setTotal(2994.05); recepcion.setFecha(new Date(System.currentTimeMillis()));

4 de 12

14/05/2011 01:11 p.m.

MENTES EN MOVIMIENTO Java web development.: ireports, netbeans,...

http://mentes-enmovimiento.blogspot.com/2008/05/ireports-netbeans-jav...

productos.add(productoA); productos.add(productoB); recepcion.setProductos(productos); recepciones.add(recepcion); return recepciones; } }

Ahora bien el codigo anterior simula el acceso a una bd, realmente no seria gran problema cambiarlo por un verdadero componente que lleve a cabo esa funcion (en un blog posterior lo llevare a cabo con ibatis). bien ahora implementaremos la clase GeneraReporte el cual en realidad es un servlet. para lo cual se pueden ayudar a crearlo con su IDE, en este caso este es el codigo resultante, recuerden que el servlet debe estar registrado en el web.xml en mi caso la ruta relativa para su acceso es /servlets/generaReporte.do

package com.ireport; import java.io.*; import java.text.DateFormat; import java.text.ParseException; import java.util.Date; import java.util.List; import javax.servlet.*; import javax.servlet.http.*; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JRExporterParameter; import net.sf.jasperreports.engine.JRRuntimeException; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import net.sf.jasperreports.engine.export.JRHtmlExporter; import net.sf.jasperreports.engine.export.JRHtmlExporterParameter; import net.sf.jasperreports.engine.util.JRLoader; import org.apache.log4j.Logger; /** * * @author ovazquez */ public class GeneraReporte extends HttpServlet { String rutaReal; private static Logger log = Logger.getLogger(GeneraReporte.class.getName()); JasperPrint jasperPrint = null; /** * Processes requests for both HTTP GET and POST methods. * @param request servlet request * @param response servlet response */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Date fechaMovimiento = null; DateFormat formato = DateFormat.getDateInstance(1);

5 de 12

14/05/2011 01:11 p.m.

MENTES EN MOVIMIENTO Java web development.: ireports, netbeans,...

http://mentes-enmovimiento.blogspot.com/2008/05/ireports-netbeans-jav...

try { fechaMovimiento = formato.parse(request.getParameter("fecha")) ; } catch (NullPointerException e) { log.error("Uno de los parametros no se recibio" + e.getMessage()); } catch(ParseException pe){ log.error("El formato de fecha es incorrecto." + pe.getMessage()); }finally{ fechaMovimiento = new Date(System.currentTimeMillis()); } String archivoSalida = "reporte_movimientos_beans.html"; ReporteRecepciones reporte = new ReporteRecepciones(); reporte.setFechaRecepcion(fechaMovimiento); PrintWriter out = null; try { jasperPrint = this.llenaReporte(reporte.createBeanCollection(), rutaReal); String rutaArchivoGenerado = rutaReal + "/pages/reportes/" + archivoSalida; JRHtmlExporter exporter = new JRHtmlExporter(); response.setContentType("text/html"); response.setHeader("Cache-Control", "no-cache"); out = response.getWriter(); exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint); exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME, rutaArchivoGenerado); exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, new Boolean(false)); exporter.setParameter(JRHtmlExporterParameter.OUTPUT_WRITER, out); exporter.setParameter(JRHtmlExporterParameter.CHARACTER_ENCODING, "UTF-8"); exporter.exportReport(); } catch (JRException ex) { log.error(ex.getMessage()); } finally { out.flush(); out.close(); } } private JasperPrint llenaReporte(List dataList, String ruta) throws JRException { //EN CASO DE PASARLE PARAMETROS AL REPORTE //Map parameters = new HashMap(); //RUTA DEL FORMATO QUE VAMOS A LLENAR DE DATOS QUE YA FUE COMPILADO File reportFile = new File(ruta + "/pages/reportes/reporte_recepciones_beans.jasper"); // NOS ASEGURAMOS QUE EL ARCHIVO .jasper EXISTA. if (!reportFile.exists()) { log.error("No se encontro el reporte especificado"); throw new JRRuntimeException("El reporte especificado no existe. verifique la ruta."); } // CARGAMOS EL REPORTE JasperReport jasperReport = (JasperReport) JRLoader.loadObject(reportFile); // PASAMOS JRBeanCollectionDataSource (EL CUAL ES LA LISTA DE OBJETOS QUE VAMOS A IMPRIMIR) return JasperFillManager.fillReport(jasperReport, null, new JRBeanCollectionDataSource(dataList)); }

6 de 12

14/05/2011 01:11 p.m.

MENTES EN MOVIMIENTO Java web development.: ireports, netbeans,...

http://mentes-enmovimiento.blogspot.com/2008/05/ireports-netbeans-jav...

//NOS PERMITE INICIALIZAR VARIABLES QUE SON UTILIZADAS EN EL SERVLET. public void init(ServletConfig config) throws ServletException { super.init(config); ServletContext contexto = config.getServletContext(); rutaReal = contexto.getRealPath("/"); if (log.isDebugEnabled()) { log.debug("ruta real" + rutaReal); } } /** * Handles the HTTP GET method. * @param request servlet request * @param response servlet response */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Handles the HTTP POST method. * @param request servlet request * @param response servlet response */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Returns a short description of the servlet. */ public String getServletInfo() { return "Short description"; } // } Estos son los beans, solamente completen el codigo con los metodos get y set package com.ireport; public class Almacenista { private String clave; private String nombre; } package com.ireport; public class Producto { private int id; private String clave; private String descripcion; private String marca; private String modelo; } package com.ireport; import java.util.Date; import java.util.List; public class Recepcion {

7 de 12

14/05/2011 01:11 p.m.

MENTES EN MOVIMIENTO Java web development.: ireports, netbeans,...

http://mentes-enmovimiento.blogspot.com/2008/05/ireports-netbeans-jav...

private String clave; private Date fecha; private Almacenista recibe; private List productos; private String factura; private double total; private Producto mProducto; private Almacenista mAlmacenista; }bien, si ustedes copian el codigo van a tener muchos problemas con los imports ya que hasta el momento no hemos copiado la libreria de jasper ni la de log4j que nos sirve para aventar los logs a un archivo, en el caso de netbeans pueden ir a libraries ->click derecho -> add library -> create -> pongale cualquier nombre -> busquen la carpeta en donde esta el reporteador y despues en el lib seleccionen jasperreports(version).jar -> aadan la nueva libreria al proyecto y listo ya no deberian marcarles ningun error. en el caso de log4j (proceden de la misma manera para agregar la libreria) lo pueden descargar de su sitio web o si gustan eliminen el codigo que hace referencia a el, que no es mucho.

aqui hay un ultimo punto. Si decides incluir log4j en el proyecto entonces te recomiendo que agreges este archivo con el nombre log4j.properties en la carpeta classes de tu proyecto. ya que te permitira enviar los logs a un archivo. log4j.rootCategory=DEBUG, logfile log4j.appender.logfile.Append=false log4j.appender.logfile=org.apache.log4j.RollingFileAppender log4j.appender.logfile.File=D:/aplicacion.log log4j.appender.logfile.MaxFileSize=512KB log4j.appender.logfile.MaxBackupIndex=3 log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern= %p [%c] -- %d{DATE} - %m%n #configuracion de la jerarquia de los mensajes log4j.logger.com = DEBUG, logfile log4j.logger.com.ireport=INFO bien. ahora hay un punto que es muy importante, para poder disear el reporte con nuestros objetos ireports nos pide que metamos todas nuestras clases en un jar, la verdad ignoro por que pero es necesario ya que de otra manera nos marcara un error que mas o menos dice "class tal tal tal not foud. chech your class path" ok, bueno entonces para esto es importante crear en cierta ubicacion el jar que contenga nuestras clase para esto realice un pequeo archivo .bat que realiza la tarea de crear el jar y copiarlo a cierta ubicacion los comandos son los siguientes. d: chdir D:\datos\EJEMPLOS\ireportsjavabeandatasource\build\web\WEB-INF\classes jar -cf reportes.jar com\**.* copy reportes.jar "D:\datos\EJEMPLOS\ireportsjavabeandatasource" pause como veran la primera linea nos cambia de unidad. si no lo requieres eliminala (la linea, no tu unidad jejeje). la siguiente linea te posiciona en la carpeta en donde estan tus clase compiladas (muy importante) porteriormente al comando jar le pasamos los siguientes argumentos cf (c = current directory, f= nombre del archivo) el nombre con el que se generara y finalmente las carpetas a incluir en nuestro jar la ultima linea copia el jar generado a una ubicacion esta no importa puede ser cualquiera, en mi caso elegi ponerla en la misma carpeta raiz de mi proyecto. ok, eso lo pueden copiar y poner en un archivo con extencion bat y ejecutarlo cada que se requiera. en este punto ya deben tener todas las clases compilados y tambien el jar. (click derecho sobre tu proyecto y le das clean and build en el caso de netbeans y despues ejecutas el .bat)

8 de 12

14/05/2011 01:11 p.m.

MENTES EN MOVIMIENTO Java web development.: ireports, netbeans,...

http://mentes-enmovimiento.blogspot.com/2008/05/ireports-netbeans-jav...

Procedemos a iniciar el diseo de nuestro reporte. abrimos ireports creamos nuestro reporte, le damos new document y lo nombramos "reporte_recepciones_beans", ojo, si le pones un nombre diferente asegurate de cambiarlo en el codigo ya que de lo contrario te marcara un error de filenotfoundexception, asi mismo la ruta en la que cree mis reportes es la sig pages/reportes a partir del directorio raiz. Hasta este punto deberiamos coincider en la estructura de nuestros archivos y clases, asi que debe ser mas o menos asi.

Primero que nada vamos a establecer el classpath a nuestro archivo jar que ya debe estar creado desde ireports en el menu options-> classpath -> el boton add jar -> buscamos nuestro jar generado presionamos aceptar y posteriormente save classpath, de lo contrario no se guardara la ruta. ahora en el menu data -> conecction /datasources -> new -> seleccionamos javaBeans set datasources -> next -> y los cuadros de dialogo los llenamos de la siguiente manera name: recepciones (nombre de la coneccion puede ser cualquier otro) factory class: com.ireport.ReporteRecepciones (paquetes y nombre de la clase) option: collection of javaBeans (es la que debe quedar seleccionada) static method to call.: listaRecepciones (nuestro metodo que genera la lista) use field description: seleccionado debe quedar asi.

al precionar el boton test nos saldra un mensaje que dice "null" no se preocupen, esto es por que no estamos usando un metodo estatico si al metodo createBeanCollection de la clase ReporteRecepciones lo declaran como estatico les marcara succesful o algo asi. no hay ningun

9 de 12

14/05/2011 01:11 p.m.

MENTES EN MOVIMIENTO Java web development.: ireports, netbeans,...

http://mentes-enmovimiento.blogspot.com/2008/05/ireports-netbeans-jav...

problema continuaremos ya que funciona de cualquier manera. bien ya tenemos la conexion que nos proveera de los datos ahora tenemos que decirle al reporteador de que clase son los objetos que obtendremos y las propiedades a las cuales deseamos acceder. para esto nos vamos al menu data -> report query -> en la pestaa javabean data source- > escribimos el paquete y nombre de la clase que vamos a representar en el reporte.-> read attributes y nos debe quedar de la sig manera. si observan detenidamente la imagen se daran cuenta de que no deplege la lista de productos para ver su contenido y esto tiene una razon muy simple, no te muestra mas que un metodo boolean() asi que surge entonces una duda, como vamos a representar los objetos que estan en la lista, bueno pues esto lo tendremos que hacer en un subreporte lo cual sera despues de probar que nuestro reporte principal funciona.

ok en la ventana en la que estamos posicionados seleccionen los campos que se van a incluir en el reporte (como en la imagen de arriba) y precionamos el boton add selected fields y finalmente ok. bien ya tenemos nuestros campos listos para mostrarse en el reporte ahi los debemos posicionar en el area en donde se veran. del lado izquierdo vemos una ventanita que dice documento estructure. ahi estan nuestros campos asi como variables definidas por irepors o las que nosotros pudieramos crear. Bien expandimos el nodo de color verde que dice fields y seleccionamos los que deseemos, los posicionamos en la banda column header. bien, hasta este punto ya tenemos casi todo para ejecutar nuestro reporte. ahora solo unos detalles mas. OJO si ejecutas el reporte en el diseador de ireports muy probablemente recibas un error de NullPointerException. si quieres ver los datos generados debes declarar el metodo (de nuevo lo digo) como static primero nos hacen falta algunas librerias para que nuestro reporte se ejecute de manera correcta. estas las podemos encontrar en la misma carpeta del ireports en el directorio bin. en mi caso son las siguientes (puden variar las versiones de acuerdo a la version del ireports que esten usuando)

ok como veran esas son las librerias que deben copiar al tomcat esta puede variar de la v 5.x.x a la 6.x no se a que se deba, para la v5.x los paquetes deben de ir en la carpeta shared, esto significa que los demas proyectos podran utilizarla, para tomcat 6 estas deben ir

10 de 12

14/05/2011 01:11 p.m.

MENTES EN MOVIMIENTO Java web development.: ireports, netbeans,...

http://mentes-enmovimiento.blogspot.com/2008/05/ireports-netbeans-jav...

en lib (como se aprecia en la imagen) muy bien hora de poner en marcha el reporte. primero lo compilamos y ejecutamos, para verificar que no se esten generando errores, los datos se deben mostrar en pantalla ya que estos estan "hardcodeados" si los datos provinieran de una base de datos requeririamos el componente que accesa a la misma. por el momento es un ejemplo sencillo. como no hemos creado una pagina que nos de el link para ejecutar el servlet entonces lo tendremos que ingresar manualmente, en mi caso en nombre de mi proyecto es http://localhost:8084/ireportsjavabeandatasource/servlets/generaReporte.do bien en este punto se deberia de aparecer la siguiente pantalla Bueno creo que llegue a mi limite de imagenes ya que el editor no me permite insertar mas. si alguien sabe como cambier esto se lo agradecer. ok, se supone que en este punto ya deberias poder visualizar los datos de tu reporte, en caso de que no puedas, no te desesperes, has lo siguiente paso a paso. 1.-verifica tu clases. 2.-compila todo tu proyecto. 3.-crea el jar en algun directorio 4.-inicia ireport 5.-verifica que el classpath apunte exactamente a tu jar 6.-crea el data source (JavaBean set Data source, pruebalo para que veas que mensaje te manda, si creaste el metodo de la sig forma el mensaje debe ser "succesfull" public static List createBeanCollection(){ //codigo } se deben mostrar los datos en pantalla. de lo contrario si lo creaste de las iguiente forma te manda "null", no se mostraran en pantalla, solo te apareceran null en cada campo. public List createBeanCollection(){ //codigo } 7.- ejecutalo desde tu contexto web (antes copiate las librerias a los lugares indicados anteriormente Bueno pues espero que les sea de utilidad, en un par de dias publicare como agregarle el subreporte. ya que tengo que regresar a mi trabajo. Publiquen sus dudas o comentarios tratare de contestar lo antes posible.Publicado por omar en 10:07 Etiquetas: ireports, jasperreports, java, JavaBeans set datasources, tomcat Reacciones:

4 comentarios:OscarA dijo... Hola Omar, tu tutorial es uno de los mejores que he conseuido. Me fue muy til. Por favor aydame con la parte del subreporte para mostrar los valores de la lista ya que me est dando un net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression Gracias 24 de septiembre de 2008 15:32

omar dijo... que tal Oscar, que bueno te te haya sido util, mira si gustas pon tu direccin de correo o envame uno y te lo respondo incluyndote el proyecto.

11 de 12

14/05/2011 01:11 p.m.

MENTES EN MOVIMIENTO Java web development.: ireports, netbeans,...

http://mentes-enmovimiento.blogspot.com/2008/05/ireports-netbeans-jav...

3 de octubre de 2008 16:33

Annimo dijo... Hola Omar tu tutorial me ha servido de mucho..pero al invocar al jasper desde mi proyecto me sale este error: cannot assign instance of net.sf.jasperreports.engine.base.JRBaseTextField to field net.sf.jasperreports.engine.base.JRBaseLineBox.boxContainer of type net.sf.jasperreports.engine.JRBoxContainer in instance of net.sf.jasperreports.engine.base.JRBaseLineBox Agradeceria tu ayuda si pudieras :) 23 de abril de 2009 15:11

Paulina dijo... hola yo tengo una super duda con ireport ya eh echo reportes y me han funcionado muy bien todos. en mis reportes anteriores cuando pongo la fecha aparece el pattern de modo EEEEE dd MMMMM yyyy HH:mm:ss y eso muestra la fecha de modo lunes 03 agosto 2009 15:34:14 pero quiero que aparezca Lunes y Agosto con la primer letra mayuscula. se puede solcionar??? saludoss 4 de agosto de 2009 15:51

Publicar un comentario en la entradaPor favor mantn tus comentarios relacionados al tema.

Comentar como:

Enlaces a esta entradaCrear un enlace Entrada ms reciente Suscribirse a: Enviar comentarios (Atom) Pgina principal

12 de 12

14/05/2011 01:11 p.m.