sábado, 28 de agosto de 2010

Exemplo de Relatório em Java para web

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.
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:

Pedro disse...

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)

Jabes Felipe disse...

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.

Franklin disse...

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

Franklin disse...

Olá Jabes!
Consegui .... o seu exemplo foi muito importante pro meu projeto ... valeu e muito.
Obrigado.

Franklin Borges

Unknown disse...

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

Jabes Felipe RSS Feed Jabes Felipe