Olá Pessoal,
Neste post, irei mostrar um exemplo de como fazer um simples relatório em Java para aplicações web, para a geração do relatório usaremos o Jasper Reports que é um Framework open-source, para a criação do layout usaremos o Framework iReport, para testarmos a aplicação, criamos um Servlet, que será executado no servidor JBoss4 usando o Eclipse.
Para baixar o JasperReports: http://jasperforge.org/projects/jasperreports
Para baixar o iReport: http://jasperforge.org/projects/ireport
Ao final do post o projeto será disponibilizado para download com todas bibliotecas usadas e os arquivos do relatório.
1. Passo: Estrutura do projeto:
2. Passo: Vamos criar a estrutura do relatório do iReport, crie um relatório com o nome clientes, com o seguinte arquivo xml:
<?xml version="1.0" encoding="UTF-8"?><jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="clientes" language="groovy" pageWidth="612" pageHeight="792" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <property name="ireport.zoom" value="1.0"/> <property name="ireport.x" value="0"/> <property name="ireport.y" value="0"/> <style name="efeitoZebra"> <conditionalStyle> <conditionExpression><![CDATA[new Boolean(($V{COLUMN_COUNT}.intValue() % 2) != 0)]]></conditionExpression> <style mode="Opaque" backcolor="#BAB8B8"/> </conditionalStyle> </style> <parameter name="clientesLista" class="java.util.List"/> <parameter name="titulo" class="java.lang.String"/> <parameter name="total" class="java.lang.String"/> <field name="nome" class="java.lang.String"/> <field name="endereco" class="java.lang.String"/> <field name="email" class="java.lang.String"/> <field name="cidade" class="java.lang.String"/> <background> <band splitType="Stretch"/> </background> <title> <band height="38" splitType="Stretch"> <textField> <reportElement x="109" y="0" width="349" height="35"/> <textElement lineSpacing="1_1_2"> <font size="20" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$P{titulo}]]></textFieldExpression> </textField> </band> </title> <pageHeader> <band height="17" splitType="Stretch"/> </pageHeader> <columnHeader> <band height="34" splitType="Stretch"> <staticText> <reportElement x="0" y="14" width="137" height="20" forecolor="#010101" backcolor="#3B56EC"/> <textElement> <font size="12" isBold="true" isItalic="true"/> </textElement> <text><![CDATA[Nome]]></text> </staticText> <staticText> <reportElement x="137" y="14" width="149" height="20" forecolor="#010101" backcolor="#3B56EC"/> <textElement> <font size="12" isBold="true" isItalic="true"/> </textElement> <text><![CDATA[Endereço]]></text> </staticText> <staticText> <reportElement x="286" y="14" width="153" height="20" forecolor="#010101" backcolor="#3B56EC"/> <textElement> <font size="12" isBold="true" isItalic="true"/> </textElement> <text><![CDATA[E-mail]]></text> </staticText> <staticText> <reportElement x="439" y="14" width="133" height="20" forecolor="#010101" backcolor="#3B56EC"/> <textElement> <font size="12" isBold="true" isItalic="true"/> </textElement> <text><![CDATA[Cidade]]></text> </staticText> </band> </columnHeader> <detail> <band height="22" splitType="Stretch"> <textField> <reportElement style="efeitoZebra" x="137" y="0" width="149" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{endereco}]]></textFieldExpression> </textField> <textField> <reportElement style="efeitoZebra" x="439" y="0" width="133" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{cidade}]]></textFieldExpression> </textField> <line> <reportElement x="0" y="20" width="572" height="1"/> </line> <textField> <reportElement style="efeitoZebra" x="0" y="0" width="137" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{nome}]]></textFieldExpression> </textField> <textField> <reportElement style="efeitoZebra" x="286" y="0" width="153" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[$F{email}]]></textFieldExpression> </textField> </band> </detail> <columnFooter> <band height="20" splitType="Stretch"> <textField> <reportElement x="391" y="0" width="181" height="20"/> <textElement> <font size="12" isBold="true"/> </textElement> <textFieldExpression class="java.lang.String"><![CDATA[$P{total}]]></textFieldExpression> </textField> </band> </columnFooter> <pageFooter> <band height="54" splitType="Stretch"> <textField> <reportElement x="225" y="17" width="80" height="20"/> <textElement textAlignment="Right"/> <textFieldExpression class="java.lang.String"><![CDATA["Página "+$V{PAGE_NUMBER}+" de"]]></textFieldExpression> </textField> <textField evaluationTime="Report"> <reportElement x="305" y="17" width="40" height="20"/> <textElement/> <textFieldExpression class="java.lang.String"><![CDATA[" " + $V{PAGE_NUMBER}]]></textFieldExpression> </textField> </band> </pageFooter> <summary> <band height="42" splitType="Stretch"/> </summary></jasperReport>
clientes.jrxml
3. Passo: Vamos criar um Servlet, chamado RelatorioServlet, o foco do post é mostrar como fazer relatório em Java, para isto, deixarei toda lógica no Servlet, deixando o projeto com uma baixa coesão, fique a vontade para fazer o projeto com a separação das camadas. Crie também uma JavaBean chamado Cliente, para carregar as informações dos Clientes, criaremos um List de Clientes no próprio Servlet. O exemplo terá uma opção que visualizará o Relatório, usando o método estático viewReport da Classe JasperViewer, a outra opção será o pdf do Relatório usando o método estático printReportToPdfFile da Classe JasperPrintManager.
package modelo;
public class Cliente { private String nome; private String endereco; private String email; private String cidade; public Cliente() { super(); } public Cliente(String nome, String endereco, String email, String cidade) { super(); this.nome = nome; this.endereco = endereco; this.email = email; this.cidade = cidade; } 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 getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getCidade() { return cidade; } public void setCidade(String cidade) { this.cidade = cidade; }
}
Cliente.java
package relatorio;
import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;
import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;
import modelo.Cliente;import net.sf.jasperreports.engine.JRException;import net.sf.jasperreports.engine.JasperFillManager;import net.sf.jasperreports.engine.JasperPrint;import net.sf.jasperreports.engine.JasperPrintManager;import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;import net.sf.jasperreports.view.JasperViewer;
public class RelatorioServlet extends HttpServlet { private static final long serialVersionUID = 1L; public RelatorioServlet() { super(); } public void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List clientesLista = new ArrayList(); clientesLista.add(new Cliente("Jabes Felipe", "Copacabana, 54", "jabesfelipe@gmail.com", "Rio de Janeiro")); clientesLista.add(new Cliente("Camila Ribeiro", "Ipanema,324", "camilarib@gmail.com", "Rio de Janeiro")); clientesLista.add(new Cliente("Jaque Silva", "Lapa, 44", "jaquesilva@gmail.com", "Rio de Janeiro")); clientesLista.add(new Cliente("Bruna Lira", "Centro, 32", "brunalira@gmail.com", "Rio de Janeiro")); clientesLista.add(new Cliente("Amanda Alves", "Lapa, 342", "amandaa@gmail.com", "Rio de Janeiro")); clientesLista.add(new Cliente("Priscila Ratina", "Barra Tijuca, 86", "priscilaratina@gmail.com", "Rio de Janeiro")); clientesLista.add(new Cliente("Carolina Marques", "Copacabana, 234", "carolinamarques@gmail.com", "Rio de Janeiro")); try { String acao = request.getParameter("acao") == null ? "" : request.getParameter("acao"); String caminhoJasper = getServletContext().getRealPath("/WEB-INF/classes/relatorio/") + "/"; String caminho = getServletContext().getRealPath("/"); JRBeanCollectionDataSource jrDT = new JRBeanCollectionDataSource(clientesLista); Map parametros = new HashMap(); parametros.put("titulo", "Relatórios de Clientes"); parametros.put(clientesLista, jrDT); parametros.put("total", "Total de Clientes: " + clientesLista.size()); JasperPrint jasperPrint = JasperFillManager.fillReport(caminhoJasper + "clientes.jasper", parametros, jrDT); if("visualizar".equals(acao)) { JasperViewer.viewReport(jasperPrint, false); } else if("pdf".equals(acao)) { JasperPrintManager.printReportToPdfFile(jasperPrint, caminho + "/RelatorioCliente.pdf"); response.sendRedirect("RelatorioCliente.pdf"); } else { response.sendRedirect("index.jsp"); } } catch (JRException e) { e.printStackTrace(); }
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); }
}
RelatorioServlet.java
3. Passo: Para testar, crie um index.jsp, como o do exemplo abaixo:
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Relatório em Java</title><script type="text/javascript"> function visualizarRelatorio() { enviar("visualizar"); }
function gerarRelatorioPDF() { enviar("pdf"); }
function enviar(acao) { document.forms[0].acao.value = acao; document.forms[0].target = "_blank"; document.forms[0].action = "./RelatorioServlet"; document.forms[0].submit(); }</script></head><body><h1>Relatório de Clientes</h1><form action="./RelatorioServlet" method="post" onsubmit="return false;"> <input type="hidden" name="acao" /> <input type="submit" value="Visualizar Relatorio" onclick="javascript:visualizarRelatorio();"> <input type="submit" value="Gerar Relatório PDF" onclick="javascript:gerarRelatorioPDF();"> </form></body></html>
index.jsp
Exemplo: Index
Vizualizando o Relatório:
PDF do Relatório:
Bom galera, este foi um exemplo de como criar relatórios em Java, usando o JasperReport e o iReport,
Para quem quiser baixar o exemplo, clique aqui.
Qualquer dúvida, crítica ou sugestão, fico à disposição.
5 comentários:
boa tarde...
eu axei muito interessante o q vc fez...
so que estou com alguns problemas...
sou iniciante em java, tenho que desenvolver um projeto com relatorio, porem nao entendi muito o q vc fez.
eu to trabalhando com 4 classes
CTR ( controller)
MODEL (onde coloco meus sets e gets)
VIEW (servlet onde chamo os metodos)
DAO ( conexao dao e daoImp)
Neste exemplo de relatório, centralizei toda lógica e controller no Servlet, deixando a classe com baixa coesão, ou seja, esta classe possui muita responsabilidade, o ideal seria separar em mais classes. No teu caso, poderia criar, por exemplo, uma classe RelatorioBuniness, e nela irá toda lógica necessária para seu relatório, depois, basta chamá-la no seu Servlet.
Olá Jabes!
Gostei muito do exemplo ... muito bom mesmo, porem estou utilizando um banco em MySQL e o iReport ... o que devo fazer na classe e o servlet?
Abs
Olá Jabes!
Consegui .... o seu exemplo foi muito importante pro meu projeto ... valeu e muito.
Obrigado.
Franklin Borges
Estou com meu projeto rodando. Imprime 1 relatório. Agora estou tentando mandar imprimir um segundo relatório e não estou conseguindo.
Criei o primeiro Servlet, funcionou certinho. Criei um segundo Servlet para o segundo relatório mas não consigo mandar executar.
Poderia me dar uma ajuda?
Postar um comentário