Share Button

 

Faça o download do exemplo completo deste tutorial desenvolvido com NetBeans 7.0.  
As bibliotecas utilizadas (JasperReports e PrimeFaces) estão inclusas no arquivo compactado deste download.

Já faz algum tempo que estou desenvolvendo uma aplicação WEB e precisei gerar relatórios nas extensões em pdf e rtf utilizando JasperReports, depois de várias tentativas para gerar os relatórios não obtive sucesso.  Pesquisando em diversos fóruns, encontrei uma solução que adaptei para minha necessidade e que agora compartilho com vocês.

Neste poste não falarei sobre as tecnologias utilizadas, e sim, a solução que eu encontrei, ajudando quem precisar gerar relatórios nas extensões pdf e rtf utilizando JasperReports e PrimeFaces. Estou assumindo que o leitor deste tutorial  já conheça como criar um projeto web, sua estrutura e também a utilização do JasperReports com IReport. Futuramente irei elaborar um tutorial detalhado de como gerar os relatórios explicando cada tecnologia.

public interface TipoRelatorio {

public final int PDF = 0;
public final int RTF = 1;

}

Listagem 1: Interface TipoRelatorio

 

A interface TipoRelatorio da listagem 1 possui dois campos: PDF e RTF, que representam respectivamente os tipos de relatórios a serem gerados.Os relatórios em JasperReports podem ser gerados baseados em uma consulta SQL, retornando um objeto ResultSet ou uma lista de objetos. Neste exemplo o relatório será gerado baseado em uma lista de objetos da classe do tipo Pessoa.

 

public class Pessoa {

private String nome;

private String endereco;

private String bairro;

private String telefone;

public String getNome() {
return nome;
}

public void setNome(String nome) {
this.nome = nome;
}

public String getEndereco() {
return endereco;
}

public void setEndereco(String endereco) {
this.endereco = endereco;
}

public String getBairro() {
return bairro;
}

public void setBairro(String bairro) {
this.bairro = bairro;
}

public String getTelefone() {
return telefone;
}

public void setTelefone(String telefone) {
this.telefone = telefone;
}

}

Listagem 2: Classe Pessoa

 

Agora será necessário criar a classe Managed Bean, responsável por receber requisições das páginas web, neste caso, a requisição para gerar os relatórios.

 

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

/**
* @author Paulo Vinícius Moreira Dutra
* @version 1.0
*/
@ManagedBean (name="exemploMB")
@ViewScoped
public class ExemploRelatorioMB implements Serializable{

@PostConstruct
public void construct(){
}

protected void redirect(String page){

FacesContext ctx = FacesContext.getCurrentInstance();
ExternalContext ec = ctx.getExternalContext();

try {
ec.redirect(ec.getRequestContextPath() + page);
} catch (IOException ex) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), ex.getMessage()));
}

}

public void imprimirRelatorio() throws Exception{

try
{

List<Pessoa> listagem = new ArrayList<Pessoa>();

Pessoa pessoa1 = new Pessoa();
pessoa1.setNome("João Pereira da Silva");
pessoa1.setEndereco("Rua da Boa Esperança, N° 8");
pessoa1.setBairro("Esperança");
pessoa1.setTelefone("5555-5555");

Pessoa pessoa2 = new Pessoa();
pessoa2.setNome("Silvia de Oliveira Cunha");
pessoa2.setEndereco("Rua das  Orquídeas, Nº 15");
pessoa2.setBairro("Centro");
pessoa2.setTelefone("4444-44444");

listagem.add(pessoa1);
listagem.add(pessoa2);

FacesContext ctx = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) ctx.getExternalContext().getSession(false);
session.setAttribute("listagem", listagem);
session.setAttribute("relatorio", "relatorio.jasper");
session.setAttribute("tipo", TipoRelatorio.PDF);
redirect("/ExemploRelatorioServlet");

}catch(Exception ex){
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, ex.getMessage(), ex.getMessage()));
}
}

}

Listagem 3: Classe ManagedBean

 

Na listagem 3, a classe ExemploRelatorioMB possui o método imprimirRelatorio(), neste método preencho uma lista de objetos do tipo Pessoa, observe que, adiciono os objetos manualmente na lista, um resultado de uma consulta também poderia ser utilizado, basta apenas utilizar um framework de persistência, como por exemplo, Hibernate, que já preenche de forma automática todos os campos do objetos com o resultado de uma consulta.
List<Pessoa> listagem = new ArrayList<Pessoa>();

Pessoa pessoa1 = new Pessoa();
pessoa1.setNome("João Pereira da Silva");
pessoa1.setEndereco("Rua da Boa Esperança, N° 8");
pessoa1.setBairro("Esperança");
pessoa1.setTelefone("5555-5555");

Pessoa pessoa2 = new Pessoa();
pessoa2.setNome("Silvia de Oliveira Cunha");
pessoa2.setEndereco("Rua das  Orquídeas, Nº 15");
pessoa2.setBairro("Centro");
pessoa2.setTelefone("4444-44444");

listagem.add(pessoa1);
listagem.add(pessoa2);

Listagem 4: Lista de objetos do tipo Pessoa

 

Por fim, recupero a instância da classe FaceContext e HttpSession. Na classe HttpSession defino os parâmetros a serem enviados para o servlet: listagem, relatorio e tipo, onde são definidos a lista de objetos, o arquivo do relatório e o tipo de relatório que desejo gerar, pdf ou rtf.
FacesContext ctx = FacesContext.getCurrentInstance();

HttpSession session = (HttpSession) ctx.getExternalContext().getSession(false);
session.setAttribute("listagem", listagem);
session.setAttribute("relatorio", "relatorio.jasper");
session.setAttribute("tipo", TipoRelatorio.PDF);

redirect("/ExemploRelatorioServlet");

Listagem 5: Definindo os parâmetros

 

A classe Servlet chamada pelo Managed Bean:

import br.exemplo.TipoRelatorio;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRRtfExporter;

/**
* @author Paulo Vinícius Moreira Dutra
* @version 1.0
*/
@WebServlet(name = "ExemploRelatorioServlet", urlPatterns = {"/ExemploRelatorioServlet"})
public class ExemploRelatorioServlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

InputStream caminho = null;

ServletOutputStream ouputStream = null;

try{

HttpSession session = request.getSession(true);

//Recuperando os parâmetros enviados
List listagem = (List)session.getAttribute("listagem");
String relatorio = session.getAttribute("relatorio").toString();
int tipo = Integer.parseInt(session.getAttribute("tipo").toString());

if (listagem == null)
listagem = new ArrayList();

caminho = ExemploRelatorioServlet.class.getResourceAsStream(relatorio);

JRDataSource jrds = new JRBeanCollectionDataSource(listagem);
JasperPrint jasperPrint = JasperFillManager.fillReport(caminho, null, jrds);

byte bytes[] = null;

switch(tipo)
{

case TipoRelatorio.PDF:

response.setHeader("application/pdf", "Content-Type");
response.setContentType("application/pdf");
bytes = JasperExportManager.exportReportToPdf(jasperPrint);

break;

case TipoRelatorio.RTF:

ByteArrayOutputStream output = new ByteArrayOutputStream();

JRExporter exporter = null;
exporter = new JRRtfExporter();                                        ;
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "UTF-8");
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, output);
exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

exporter.exportReport();

bytes = output.toByteArray();

String fileName = "relatorio.rtf";
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");

break;

}

response.setContentLength(bytes.length);
ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();

}catch(Exception e){
e.printStackTrace();
}finally {

if (caminho != null)
caminho.close();

if (ouputStream != null)
ouputStream.close();

}

}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

@Override
public String getServletInfo() {
return "Short description";
}

}
Listagem 6: Classe Servlet

 

A listagem 7 demonstra a página web principal da aplicação, a implementação do código é bem simples, possuindo apenas um botão chamando o método imprimirRelatorio() da classe ExemploRelatorioMB.
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.prime.com.tr/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:head>
<title>Exemplo Relatório</title>
</h:head>
<h:body>

<h:form prependId="true">

<p:commandButton action="#{exemploMB.imprimirRelatorio()}" value="Relatório PDF" immediate="true">
</p:commandButton>

</h:form>

</h:body>
</html>

Listagem 7: index.xhtml

 

 

Comments

comments

Leave a Comment