Paginação por demanda com primefaces 2.2+ datatablelazy

4 respostas
leslie-UFT

Boa noite. Pessoal já cheguei a fazer o controller e DAO funcionar perfeitamente, mas quando eu coloco no xhtml para renderizar o lazy simplemente não mostra dados nenhum. E não sei mais o que olhar.
Fico muito grato se me ajudarem.
segue o código:

xhtml com a lista:
<!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:h="http://java.sun.com/jsf/html"
		xmlns:f="http://java.sun.com/jsf/core"
                xmlns:p="http://primefaces.prime.com.tr/ui">
<h:head>
    <title>:: Tcc on-line ::</title>
    <p:resources />
</h:head>
<f:view contentType="text/html">
<h:body>
    <ui:composition template="template.xhtml">
        <ui:define name="conteudo">
            <p:messages />
            <h:form id="listaProfessores" rendered="#{usuarioController.permissaoCurrente.incluir}" prependId="false">
                <p:dataTable paginator="true"  paginatorPosition="top" dynamic="true" lazy="true"
                    rows="2" paginatorTemplate="{CurrentPageReport}{PageLinks}"
                    var="objProf" value="#{professorController.lazy}" emptyMessage="N&atilde;o foi encontrado registros" >
                    <p:column style="width: 60px;" headerText="Matr&iacute;cula">
                        <h:outputText value="#{objProf.matricula}" />
                    </p:column>
                    <p:column headerText="Nome" >
                        <h:outputText value="#{objProf.nome}" />
                    </p:column>
                     <p:column style="width: 70px;">
                         <h:commandLink action="#{professorController.delete}" rendered="#{sessionScope.currentUser.pessoa.idPessoa != objProf.idProfessor and usuarioController.permissaoCurrente.excluir}" style="width: auto;" onclick="javascript:if (!confirm('Deseja excluir este professor #{objProf.nome} ?')) return false;">
                            <f:setPropertyActionListener target="#{professorController.professor}" value="#{objProf}" />
                            <h:graphicImage value="imagens/delete.png" style="border: none;" alt="Excluir"/>
                        </h:commandLink>
                         <h:commandLink rendered="#{sessionScope.currentUser.pessoa.idPessoa == objProf.idProfessor}"  action="#{professorController.formProfessorEditar}" >
                            <f:setPropertyActionListener target="#{professorController.professor}" value="#{objProf}" />
                            <h:graphicImage value="imagens/folder_document.png" style="border: none;" alt="Editar"/>
                        </h:commandLink>
                    </p:column>
                </p:dataTable>
            </h:form>
          
      
        </ui:define>
    </ui:composition>
</h:body>
</f:view>
</html>

Controller:

package tcc.br.com.controller;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.validator.ValidatorException;
import org.primefaces.model.LazyDataModel;
import tcc.br.com.dao.MunicipioDAO;
import tcc.br.com.dao.ProfessorDAO;
import tcc.br.com.model.AreaAtuacao;
import tcc.br.com.model.Municipio;
import tcc.br.com.model.Estado;
import tcc.br.com.model.Permissao;
import tcc.br.com.model.Pessoa;
import tcc.br.com.model.Professor;
import tcc.br.com.model.Telefone;
import tcc.br.com.model.Usuario;
import tcc.br.com.util.ExceptionDatabase;
import tcc.br.com.validator.ProfessorValidator;
import tcc.br.com.validator.TelefoneValidator;

/**
 *
 * @author Leslie Cardoso da Silva
 */
@ManagedBean(name="professorController")
@SessionScoped
public class ProfessorController  implements Serializable {
    private Professor professor;
    private Municipio qryCidade;
    private AreaAtuacao qryArea;
    private Telefone telefone;
    private List<Municipio> listaCidade;
    private List<Professor> listaProfessor;
    private List<Telefone> listaContato;
    private List<AreaAtuacao> listaAreaProfessor;
    private List<AreaAtuacao> listaArea;
    private Integer ActiveTab;
    private Estado qryEstado;
    private LazyDataModel<Professor> lazy;

    public LazyDataModel<Professor> getLazy() {
        if (lazy == null) {
             lazy = new LazyDataModel<Professor>() {

                 @Override
                 public List<Professor> load(int first, int pageSize, String string, boolean bln, Map<String, String> map) {
                    try {
                        ProfessorDAO pDAO = new ProfessorDAO();
                        List<Professor> ps = pDAO.listaProfessor(first,pageSize);
                        setListaProfessor(ps);
                        return ps;
                    } catch (ExceptionDatabase e) {
                        return null;
                    }
                 }
             };
            // lazy.setPageSize(10);
         }
          return lazy;
    }

    public void setLazy(LazyDataModel<Professor> lazy) {
        this.lazy = lazy;
    }

    public Estado getQryEstado() {
        if(qryEstado == null){
            qryEstado = new Estado();
        }
        return qryEstado;
    }

    public void setQryEstado(Estado qryEstado) {
        this.qryEstado = qryEstado;
    }
...

DAO

package tcc.br.com.dao;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import tcc.br.com.model.AreaAtuacao;
import tcc.br.com.model.Pessoa;
import tcc.br.com.model.Professor;
import tcc.br.com.model.Telefone;
import tcc.br.com.model.Turma;
import tcc.br.com.model.Usuario;
import tcc.br.com.util.Conexao;
import tcc.br.com.util.ExceptionDatabase;
import tcc.br.com.util.ParseResultSetForObj;
/**
 *
 * @author Leslie Cardoso da Silva
 * @since  12-02-2011
 */
public class ProfessorDAO {

   

    public List<Professor> listaProfessor(Integer pg, Integer rows) throws ExceptionDatabase{
            Conexao con = new Conexao();
            List<Professor> list = new ArrayList<Professor>();
        try
        {
            pg += 1;
            con.open();
            StringBuilder sql = new StringBuilder();
            sql.append("SELECT id_pessoa, nome, email, cpf, data_nascimento, ");
            sql.append("id_fisica, id_professor, matricula_funcional, logradouro,");
            sql.append("complemento, bairro, numero, cep, id_municipio, nome_municipio,");
            sql.append("id_estado, id_pessoa_endereco, nome_estado, sigla_estado ");
            sql.append("FROM sigd.v_lista_professor ");
            sql.append("ORDER BY nome ");
            sql.append("LIMIT ? OFFSET ((?-1) * ?) ");
            PreparedStatement ps = con.getPreparedStatement(sql.toString());
            ps.setInt(1, rows);
            ps.setInt(2, pg);
            ps.setInt(3, rows);
            ResultSet rsProfessor = ps.executeQuery();

            ParseResultSetForObj parseObj = new ParseResultSetForObj();

            while(rsProfessor.next()){
                list.add((Professor) parseObj.convertRsForProfessor(rsProfessor, new Professor()));
            }
            return list;
        }
        catch (SQLException e) {
            throw new ExceptionDatabase(e.getMessage());
        }
        catch (ExceptionDatabase e) {
            throw new ExceptionDatabase(e.getMessage());
        }
        finally{
            con.close();
        }
    }
...

4 Respostas

jamirdeajr

Leslie,

Ao que parece faltou setar o número de registros total para o datatable

public LazyDataModel<Professor> getLazy() {  
       if (lazy == null) {  
            lazy = new LazyDataModel<Professor>() {  
 
                @Override  
                public List<Professor> load(int first, int pageSize, String string, boolean bln, Map<String, String> map) {  
                   try {  
                       ProfessorDAO pDAO = new ProfessorDAO();  
                       List<Professor> ps = pDAO.listaProfessor(first,pageSize);  
                       setListaProfessor(ps);  
                       return ps;  
                   } catch (ExceptionDatabase e) {  
                       return null;  
                   }  
                }  
            };  
            // lazy.setPageSize(10);  
            
            // Aqui você precisa setar o total de professores
            int totalProfessores = ?? // seu método DAO pra retornar número total de professores 
            lazy.setRowCount(totalProfessores);
        }  
        return lazy;  
}
leslie-UFT

Valeu Brother! Então além da consulta terei que trazer o total de registros.

jamirdeajr:
Leslie,

Ao que parece faltou setar o número de registros total para o datatable

public LazyDataModel<Professor> getLazy() {  
       if (lazy == null) {  
            lazy = new LazyDataModel<Professor>() {  
 
                @Override  
                public List<Professor> load(int first, int pageSize, String string, boolean bln, Map<String, String> map) {  
                   try {  
                       ProfessorDAO pDAO = new ProfessorDAO();  
                       List<Professor> ps = pDAO.listaProfessor(first,pageSize);  
                       setListaProfessor(ps);  
                       return ps;  
                   } catch (ExceptionDatabase e) {  
                       return null;  
                   }  
                }  
            };  
            // lazy.setPageSize(10);  
            
            // Aqui você precisa setar o total de professores
            int totalProfessores = ?? // seu método DAO pra retornar número total de professores 
            lazy.setRowCount(totalProfessores);
        }  
        return lazy;  
}
K

aconselho setar o setPageSize tbm… no primefaces versao 3.0 em alguns casos ocorre

abraços

leslie-UFT

Valeu pela dica. Agora não estou entendendo o seguinte:
Quando clico inserir ou editar ele atualiza a lista de boa, e isso que dentro desses dois metodos eu passo setlazy(null),
mas quando clico em excluir ele limpa a lista, e se tiro isso o registro que exclui ainda fica apresentado na lista.
E outra coisa gostaria de saber se alguem já implementou utilizando seus filtros no datatable do primefaces.

kubanacan:
aconselho setar o setPageSize tbm… no primefaces versao 3.0 em alguns casos ocorre

abraços

Criado 20 de março de 2011
Ultima resposta 7 de mai. de 2011
Respostas 4
Participantes 3