Jasper y JSF



En algunos casos es necesario crear nuestro propio tag para ser usado en las páginas jsf de nuestra aplicación, de tal manera que se adapte a nuestras necesidades.

reportjsf: En pocas palabras, es un tag utilizado para embeber un String en una página JSF. Su valor es entregado por un atributo de tipo String  de un backing.

He dejado el proyecto en el siguiente repositorio: http://code.google.com/p/jsfreports/

El proyecto se encuentra construido con Eclipse y JBoss 5.

El proyecto de distribución lo encuentran en:

http://code.google.com/p/jsfreports/downloads/list

Después de realizar una extensa investigación en la red sobre la manera de combinar jasper con jsf, encontré muchas cosas interesantes como por ejemplo el siguiente proyecto que trabaja en un plugin para JasperReport y JSF http://jasperreportjsf.sourceforge.net/web/index.html, pero la solución proporcionada no se adapta a mis necesidades. Mi pregunta era .... cómo combino un reporte Jasper en una página JSF ? …. Esta fué mi solución:

Como es conocido Jasper nos proporciona la generación de reportes en diferentes formatos pdf, rtf, xml, html, xls u odt. Cuando necesitamos generarlo en cualquier formato diferente a HTML lo más recomendable es usar un Servlet y proporcionarle el control desde la JSF al momento de la generación, sin embargo que pasa si lo requerimos en formato HTML? .. si usamos un servlet para ello el efecto es que toda nuestra paǵina JSF será sobreescrita por el html generado por el Servlet, es entonces en estos momentos en que pensamos en como adicionar o injectar un reporte HTML en nuestra página JSF.

El procedimiento es el siguiente:

- Generar un objeto File de nuestro reporte Jasper en formato HTML, hay que recordar que la API de Jasper maneja tres tipos de objetos File, Writer y OutputStream. Junto a este artículo se les obsequia la clase ReportsManager que cumple un papel algo así de administradora de reportes.

Para recordar como funciona esta clase dirijase al articulo "Descripción de ReportsManager".

Convertimos ese objeto File (archivo HTML) a un String como lo hace la operación getReportString en el codigo 1.1

Codigo 1.1

private <T> String getReportString (String reportsName, ArrayList<T> ls, Map parameters){
       
       String result = null;        
       ReportsManager reportsManager = new ReportsManager(reportsName,ls, parameters);
       try {
           File file = new File("file");
           BufferedReader in = new BufferedReader(new FileReader(
                   reportsManager.getReport(file, 0)));
           StringBuffer str = new StringBuffer();
           String line;
           while ((line = in.readLine()) != null) {
               str.append(line);
           }
           in.close();
           result = str.toString();
           str = null;
           file.delete();
       } catch (IOException e) {
           log.error("IOException: " + e.getMessage());
       }
       return result;
   } 

Básicamente lo que se hace es construir un BufferedReader a partir del File, luego crear un StringBuffer a partir del BufferedReader y tomar el String del StringBuffer. Esta operación se define en un backing o una clase controladora.

Lo que se ha hecho hasta el momento es obtener como String el reporte de jasper, ahora lo que debemos hacer es incluir este string en la JSF para que sea presentada como código HTML formando parte de la JSF.

<%@ taglib uri="http://reportjsf.com/" prefix="rj" %>

Y la manera de usar el tag es por ejemplo como sigue:

<rj:reportjsf value="#{backing.stringReporte}">               
    <f:verbatim></f:verbatim>
</rj:reportjsf>
Thanks for your comment