Páginas

30/3/15

iReport con Oracle PL-SQL y Aplicación Java Web Primefaces. Parte 2.

iReport con Oracle PL-SQL y Aplicación Web.

Tutorial de Jaspersoft iReport 5.6.0 utilizando Oracle PL-SQL y ejecutando el Reporte desde aplicación Java web con Primefaces. Parte 2.




Jaspersoft iReport 5.6.0 utilizando Oracle PL-SQL y JavaYa que en la 1era parte del Tutorial creamos todo lo que tiene que ver con el Jaspersoft iReport y la parte de Oracle PL/SQL en esta 2da parte vamos a crear la aplicación en Java para ejecutar el reporte, como dije anteriormente al momento de compilar el reporte en el Jaspersoft iReport se crean dos archivos en el directorio que hemos elegido, uno con la extensión .jasper y otro con la extensión .jrxml, el que nosotros vamos a ejecutar es el .jasper ya que el otro sirve para que puedas modificarlo en directamente en el iReport, la aplicación que ejecute dicho archivo será web y la vamos a crear con el framework para JSF que se llama Primefaces, hace un tiempo ya hemos hecho un tutorial para crear una aplicación desde 0 con Primefaces obteniendo como resultado una página con un menú, este es el Tutorial, vamos a seguir con ese mismo ejemplo (puedes descargar el proyecto de ese tutorial desde aquí). Para no hacer tan larga esta estrada ya que la misma está centrada en la ejecución del reporte desde una aplicación Java web utilizando Primefaces, vamos a crear en el menú un nuevo ítem, en ese nuevo ítem vamos a ejecutar el reporte que creamos con iReport, así que vamos hacer unas modificaciones pequeñas en el proyecto para llevar a cabo la ejecución del reporte.
Ahora tenemos que crear nuestro managed bean que se encargara de hacer la lógica y mostrar nuestro reporte, primero crearemos un paquete llamado "beansDatoJava" y dentro del mismo crearemos el managed bean llamado "DatoJavaReporteBean" con un método que se llame ejecutarReportePDF el cual vamos a implementar más adelante. Así debería verse nuestra estructura del proyecto ahorita:
Primefaces Estructura
Primefaces Estructura
Ahora vamos a registrar nuestro managed bean en el archivo de navegación de JSF, en el faces-config.xml, este será el código:
<?xml version="1.0" encoding="UTF-8"?>


 
  DJReporte
  beansDatoJava.DatoJavaReporteBean
  session
 
  
Ya registramos el managed bean y podemos utilizarlo en la pagina en donde está el menú, para refrescar un poco la memoria este es el menú que resulto del Tutorial de Primefaces:
Primefaces Menú
Primefaces Menú
Este es el código de la pagina que tiene el menú:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:f="http://java.sun.com/jsf/core"
 xmlns:h="http://java.sun.com/jsf/html"
 xmlns:p="http://primefaces.org/ui">

 
  datojava.blogspot.com
 
 
  
   
   
   
   
    
     
     
    
   
  
 

</html>
   
A ese menú vamos agregarle un nuevo ítem que lleve por nombre "Reporte con iReport" que será el que haga la llamada al método ejecutarReportePDF que ya creamos en el bean DatoJavaReporteBean:
   
    
Con eso creamos la nueva entrada en el menú, esa propiedad que se llama ajax hay que ponerla en false porque sino nunca va mostrar el reporte en el lado del cliente, eso es un inconveniente tonto que puede quitar tiempo así que pendiente con eso. Ya con eso tenemos todo listo, ahora como te imaginaras para poder llevar a cabo este tutorial el proyecto necesita unas cuantas librerías, las librerías que vamos a utilizar son las versiones más actualizadas o las que son dependientes de otras, recuerda que estamos utilizando primefaces-5.0.jar y el reporte lo hicimos con el ultimo Jaspersoft iReport a la fecha, el Jaspersoft iReport Designer 5.6.0, aquí te dejo los jars para que los descargues uno por uno y los incorpores a tu classpath.

Descarga de jars: Ahora recuerda que después de haber agregado las librerías a tu classpath tienes que agregarlas al Deployment Assembly.
Deployment Assembly
Deployment Assembly
Ya podemos implementar el método para ejecutar el reporte .jasper en el lado del cliente desde Primefaces, tengo que recordar que como el reporte que hicimos en el iReport hace una consulta a la base de datos, en este caso a una base de datos en Oracle PL/SQL, al hacer la llamada al .jasper debemos pasarle como parámetro la conexión a Oracle, en este dato java explico como hacer la conexión JDBC en Java.
 public void ejecutarReportePDF() {
  Connection con = null;
  try {
   // Llamamos al metodo para obtener la conexion
   con = getConnection();
   
   // Revisar si esta es la dirección donde esta tu reporte .jasper
   File file = new File("C:\\DJReportes\\reporteAlumnosDatoJava.jasper");
   
   JasperReport reporte = (JasperReport) JRLoader
     .loadObjectFromFile(file.getPath());
   JasperPrint jasperPrint = JasperFillManager.fillReport(reporte,
     null, con);

   HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
     .getCurrentInstance().getExternalContext().getResponse();
   httpServletResponse.addHeader("Content-disposition",
     "attachment; filename=reporteDatoJava.pdf");

   ServletOutputStream servletStream = httpServletResponse
     .getOutputStream();

   JasperExportManager.exportReportToPdfStream(jasperPrint,
     servletStream);
   
   FacesContext.getCurrentInstance().responseComplete();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
iReport Desde Java
iReport Desde Java
Hay varias maneras de mostrar el reporte en el lado del cliente, al ejecutar ese método se le pregunta al usuario si quiere guardar o abrir el reporte. Podemos hacer lo mismo con la clase JRExporter de jasperreports de esta manera:
 public void ejecutarReportePDF() {
  Connection connection = null;
  try {
   // Llamamos al metodo para obtener la conexion
   connection = getConnection();
   
   // Revisar si esta es la dirección donde esta tu reporte .jasper
   File file = new File(
     "C:\\DJReportes\\reporteAlumnosDatoJava.jasper");

   HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
     .getCurrentInstance().getExternalContext().getResponse();
   httpServletResponse.setHeader("Cache-Control", "no-cache");
   httpServletResponse.setHeader("Content-disposition",
     "attachment; filename=" + "reporteDatoJava" + ".pdf");
   httpServletResponse.setContentType("application/x-download");
   httpServletResponse.addHeader("Content-Type",
     "application/x-download");

   JasperReport jasperReport = (JasperReport) JRLoader
     .loadObjectFromFile(file.getPath());
   
   JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
     null, connection);

   JRExporter jrExporter = null;
   jrExporter = new JRPdfExporter();
   jrExporter.setParameter(JRExporterParameter.JASPER_PRINT,
     jasperPrint);
   jrExporter.setParameter(JRExporterParameter.OUTPUT_STREAM,
     httpServletResponse.getOutputStream());
   if (jrExporter != null) {
    try {
     jrExporter.exportReport();
    } catch (JRException e) {
     e.printStackTrace();
    }
    FacesContext.getCurrentInstance().responseComplete();
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if (connection != null)
    try {
     connection.close();
    } catch (Exception e) {
     e.printStackTrace();
    }
  }
 }
 
O podemos simplemente mostrarlo en el cliente sin preguntar ni nada y después el usuario decide que hacer.
 public void ejecutarReportePDF() {
  Connection connection = null;
  try {
   // Llamamos al metodo para obtener la conexion
   connection = getConnection();

   // Revisar si esta es la dirección donde esta tu reporte .jasper
   File file = new File(
     "C:\\DJReportes\\reporteAlumnosDatoJava.jasper");

   byte[] documento = JasperRunManager.runReportToPdf(file.getPath(),
     null, connection);
   
   String fileType = "inline";
   String reportSetting = fileType + "; filename=\""
     + "reporteDatoJava.pdf\"";
   
   HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext
     .getCurrentInstance().getExternalContext().getResponse();
   httpServletResponse.setContentType("application/pdf");
   httpServletResponse.setHeader("Content-Disposition",
     "inline; flename=\reporteDatoJava.pdf\"");
   httpServletResponse.setHeader("Cache-Control", "private");
   httpServletResponse.setContentLength(documento.length);

   ServletOutputStream servletOutputStream = httpServletResponse
     .getOutputStream();
   servletOutputStream.write(documento, 0, documento.length);
   servletOutputStream.flush();
   servletOutputStream.close();

   connection.close();
   
   FacesContext.getCurrentInstance().responseComplete();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
 
iReport Desde Java.
iReport Desde Java.

Esto es todo por ahora, si estas comenzando siempre vas a encontrar muchas excepciones con las librerías, como te dije antes, ahí tienes todas las librerías para que lleves a cabo este ejemplo sin ningún inconveniente. Cualquier duda no te olvides de comentar. Suerte.


Temas Relacionados:

3 comentarios :

  1. Hola, el reporte me sale una franja en blanco. que puede ser?

    ResponderEliminar
    Respuestas
    1. Hola, como que una franja blanca? A que te refieres, si puedes ser más explícito puedo apoyarte un poco más!

      Eliminar
  2. Buenas noches disculpa una pregunta de donde viene el getConnection.

    ResponderEliminar