domingo, 22 de abril de 2012

Jasper en jsf

Antes que nada hagamos nuestro reporte con el ireport y lo guardamos por hay...


  Tienen que poner como lenguaje Java; por defecto trae Groovy.


Primero crear el proyecto con maven:
mvn archetype:generate

Yo voy a usar un archetype que se llama:
194: remote -> org.apache.myfaces.buildtools:myfaces-archetype-helloworld20 (Archetype to create a new webapp based on MyFaces 2.0) Ojo pueden usar cualquier implementación de jsf.
Bueno luego importamos el proyecto a eclipse, como siempre...

Agregamos la siguiente dependencia al pom


 net.sf.jasperreports
 jasperreports
 4.5.1

            

 javax.servlet
 servlet-api
 2.4
 provided




        mysql
        mysql-connector-java
        5.1.6


Ahora a integrar jasper a nuestra aplicación jsf.

Vamos a escribir el siguiente controller:

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;

public class ReportGeneratorController {
 
 public void generateReport(ActionEvent actionEvent)
   throws ClassNotFoundException, SQLException, IOException,
   JRException {
  Connection connection;
  
  //Buscamos el contexto de jsf
  FacesContext facesContext = FacesContext.getCurrentInstance();
  HttpServletResponse response = (HttpServletResponse) facesContext
    .getExternalContext().getResponse();
  //Con el contexto buscamos el jasper
  // Ojo / es webapp
  InputStream reportStream = facesContext.getExternalContext()
    .getResourceAsStream("/reports/DbReport.jasper");
  ServletOutputStream servletOutputStream = response.getOutputStream();
  
  //Nos conectamos a la base de datos (creamos una coneccion)
  Class.forName("com.mysql.jdbc.Driver");
  //Ojo mybase es el nombre de la base, user y password.
  connection = DriverManager
    .getConnection("jdbc:mysql://localhost:3306/mybase?"
      + "user=user&password=secret");
  facesContext.responseComplete();
  //seteamos el contentType
  response.setContentType("application/pdf");
  
  //ejecutamos el reporte
  JasperRunManager.runReportToPdfStream(reportStream,
    servletOutputStream, new HashMap(), connection);
  // Cerramos la coneccion a la Base
  connection.close();
  // flush y close del reporte
  servletOutputStream.flush();
  servletOutputStream.close();
 }
}

Ojo copien el reporte al proyecto yo lo copie en /webapp/resources
Ahora escribimos un link en una pagina para acceder.


 
       
 
 

Tenemos que registrar nuestro controller en el face-config.xml:

  
  reportGenerator
  org.assembly.tyr.reports.ReportGeneratorController
  request
 


A probarlo!


Dejo el código:

http://code.google.com/p/jaspertyr/source/browse/

Para bajarlo pueden hacer:


git clone https://code.google.com/p/jaspertyr/