Arquivo

Archive for the ‘PrimeFaces’ Category

JSF 2.0 + PRIMEFACES + iREPORT

Neste post iremos demonstrar, de forma sucinta, como criar relatórios com iReport e como utiliza-lo em suas aplicações web. O iReport é uma ferramenta para  se desenhar relatórios para o JasperReport, que é a uma biblioteca para geração de relatórios. Escolhemos o iReport, por ser uma ferramenta open-source e de bastante disseminação na comunidade Java, além de ser muito fácil de usar e possuir integração com o JFreeChart, para geração de gráficos, e com o Barbecue, gerador de código de barras.

No nosso exemplo utilizaremos

  • Mojarra 2.0.3
  • Primefaces 2.2.1
  • Mysql JDBC Connector 5.1.14

Alé disso precisamos acrescertar ao projeto, as bibliotecas necessárias para rodar relatórios jasper. São elas:

  • Jasper Reports 3.7.6
  • iText 2.1.7
  • Grovy All 1.7.5
  • Commons beanutils 1.8.2
  • Commons collections 3.2.1
  • Commons Digester 1.7
  • Commons Logging 1.1

Lembre-se que a maioria destes jars você pode encontrar na pasta libs do iReport..

Abaixo você pode ver a estrutura que usaremos para nossa base de dados:

Imagem 1

Como você pode ver, utilizaremos uma tabela cargos(mestre) com uma tabela funcionários(detalhes), onde um cargo pode ser comum de vários funcionários, mas um funcionário só de ter um cargo.

Iniciando com o iRerpot

O iReport é uma ferramenta para criação do arquivo jrxml, que nada mais é do que uma definição do relatório em xml. Esta definição poderia ser feita em um bloco de notas, ou qualquer outro editor de texto, porém seria uma atividade incomparavelmente mais custosa para o desenvolvedor.

Com o iReport, é possível desenhar todo o relatório, incluir imagens, além de manipular sub-relatórios e diferentes fontes de dados.

Bom, no início de qualquer relatório é necessário primeiro definir a fonte de dados, ou seja, de onde iremos captar os dados para construção do relatório. Existem duas formas que gosto de trabalhar, uma é utilizando uma consulta SQL diretamente no banco e utilizando os dados retornados para preencher o relatórios. Outra forma, é através da utilização de JavaBeans enviado para o relatório apenas uma coleção dos dados a serem utilizados.

Ao construirmos um relatório temos diversas bandas aparentes na tela, estas seções são divisões da tela do relatório onde podemos preenche-las com textos e imagens .

No iReport estão visíveis 9 seções, ou bandas. São elas:

1. Title: Título do relatório. Pode ser impresso em uma página separada;

2. Page Header: Cabeçalho de cada página do relatório;

3. Column Header: Seção exibida em cada página que contém uma seção Detail;

4. Detail: Nesta seção são impressos todos os registros fornecidos ao relatório;

5. Column Footer: Exibido em cada página que contém uma seção Detail;

6. Page Footer: Rodapé de cada página;

7. Summary: Seção exibida no fim do relatório. Pode ser impresso em uma página separada;

8. No Data: Seção exibida quando não há registros;

9. Background: Nesta seção é possível inserir uma imagem de fundo que será exibida em cada página do relatório.

Fonte: Gerando relatórios com iReport – Roberto Jundi Furutani da Java Magazina 84.

Imagem 2

Criando os Beans

Na aplicação exemplo que iremos fazer, teremos dois beans. Abaixo você pode ver a codificação de ambos:

Cargo.java

public class Cargo {

private int id;

private String descricao;

public String getDescricao() {

return descricao;

}

public void setDescricao(String descricao) {

this.descricao = descricao;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

}

Funcionario.java


public class Funcionario {

private int id;

private String nome;

private String email;

private Cargo cargo = new Cargo();

public Cargo getCargo() {

return cargo;

}

public void setCargo(Cargo cargo) {

this.cargo = cargo;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getNome() {

return nome;

}

public void setNome(String nome) {

this.nome = nome;

}

}

Para que você possa utilizar os beans no iReport é necessário gerar os arquivos .jar e incluir no classpath. Caso você utilize o netbeans você poderá criar uma nova aplicação desktop, criar as classes e executar a aplicação. Dentro da pasta dist, será gerado um arquivo .jar, com o nome que você de ao projeto da aplicação. Com este arquivo criado,  basta colocar para o classpath do iReport apontar para o local onde você o salvou e pronto. Agora, você já pode configurar seu relatório baseado nos dois modelos que criamos.

Imagem 3

Para isso, vamos criar um novo relatório no iReport e depois clicar com o botão direito do mouse sobre o nome do relatório que fica na aba Report Inspector. Feito isso, clique em Edit Query. Abaixo veja imagens das telas:

Imagem 4

Imagem 5

Você deve escolher a segunda aba, JavaBean DataSource, a primeira é para utilizar-se com uma consulta SQL diretamente na base de dados. Digite o nome da classe, nome completo, incluindo o pacote e depois clique em Read Attributes e depois  selecione os campos e clique em Add Selected Field(s)

Imagem 6

Após adicionar os campos vamos montar nosso relatório. Utilize a paleta com as imagens, static text e text fields para montar seu relatório.

Montamos de acordo com a imagem abaixo:

Imagem 7

Criei uma aplicação JSF simples, somente com um botão para chamar o  relatório.

Imagem 8

Veja abaixo os DAOS:

FuncionarioDAO.java

public class FuncionarioDAO {

private Connection conexao;

public List<Funcionario> listaTodos() {

List<Funcionario> listaFuncionario = new ArrayList<Funcionario>();

String consulta = "select * from tab_funcionarios";

try {

conexao = ConnectionFactory.getMySQLConnection();

PreparedStatement ps = conexao.prepareStatement(consulta);

ResultSet rs = ps.executeQuery();

CargoDAO cargoDAO = new CargoDAO();

while(rs.next()) {

Funcionario funcionario = new Funcionario();

funcionario.setId(rs.getInt("id"));

funcionario.setNome(rs.getString("nome"));

funcionario.setEmail(rs.getString("email"));

funcionario.setCargo(cargoDAO.buscaCargoPorId(rs.getInt("tab_cargos_id")));

listaFuncionario.add(funcionario);

}

} catch (SQLException ex) {

Logger.getLogger(FuncionarioDAO.class.getName()).log(Level.SEVERE, null, ex);

}

return listaFuncionario;

}

}

CargoDAO.java

public class CargoDAO {

private Connection conexao;

public Cargo buscaCargoPorId(int id) {

Cargo cargo = new Cargo();

try {

conexao = ConnectionFactory.getMySQLConnection();

String consulta = "select * from tab_cargos where id=?";

PreparedStatement ps = conexao.prepareStatement(consulta);

ps.setInt(1, id);

ResultSet rs = ps.executeQuery();

if(rs.next()) {

cargo.setId(rs.getInt("id"));

cargo.setDescricao(rs.getString("descricao"));

}

} catch (SQLException ex) {

Logger.getLogger(CargoDAO.class.getName()).log(Level.SEVERE, null, ex);

}

return cargo;

}

}

Para chamar o relatório, colocamos o arquivo compilado(.jasper) na pasta report dentro da pasta web-inf e usamos o método imprimeRelatório() do manager bean:

public void imprimeRelatorio() throws IOException, SQLException {

Connection con = ConnectionFactory.getMySQLConnection();

FuncionarioDAO funcionarioDAO = new FuncionarioDAO();

List<Funcionario> listaFuncionario = new ArrayList<Funcionario>();

listaFuncionario = funcionarioDAO.listaTodos();

JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(listaFuncionario);

HashMap parameters = new HashMap();

try {

FacesContext facesContext = FacesContext.getCurrentInstance();

facesContext.responseComplete();

ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();

JasperPrint jasperPrint = JasperFillManager.fillReport(scontext.getRealPath("/WEB-INF/report/relatorio_funcionarios_por_cargo.jasper"), parameters, ds);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

JRPdfExporter exporter = new JRPdfExporter();

exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);

exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, baos);

exporter.exportReport();

byte[] bytes = baos.toByteArray();

if (bytes != null && bytes.length > 0) {

HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();

response.setContentType("application/pdf");

response.setHeader("Content-disposition", "inline; filename=\"relatorioPorData.pdf\"");

response.setContentLength(bytes.length);

ServletOutputStream outputStream = response.getOutputStream();

outputStream.write(bytes, 0, bytes.length);

outputStream.flush();

outputStream.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}


Abaixo o resultado do relatório:

É isso, o que ficar de dúvida a gente tenta resolver pelos comentários.

Abraços.