JSF - Primefaces - Datatable paginado

8 respostas
andersonfs

Olá amigos,

Estou iniciando o uso com o Primefaces e estou configurando o Datatable paginado e vi uma solução com o LazyDataModel. Eu até consigo consultar os dados no banco mas a tabela não é carregada.

Seguem os códigos:

classe.xhtml

<p:dataTable var="classe" value="#{classeManagedBean.lista}"
				paginator="true" rows="10"
				selectionMode="single"
				lazy="true" dynamic="true"
				paginatorTemplate="{PageLinks}"
				rowsPerPageTemplate="5,10,15"
				emptyMessage="#{msg.classe_tabela_vazia}">
</p:dataTable>

ClasseManagedBean.java

//No Construtor - Onde lista é um atritubo LazyDataModel e remote é um EJB que faz acesso ao EntityManager e realiza a consulta.
public ClasseManagedBean() {
   if (lista == null) {
      lista = new LazyDataModel<Classe>() {

      @Override
      public List<Classe> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {
            List<Classe> classes = remote.findAllClasses(pageSize, first);
	    return classes;
       };
       lista.setPageSize(10);
   }
}

public LazyDataModel<Classe> getLista() {
   return lista;
}

Tais métodos são chamados normalmente porém a tabela permanece vazia.

Alguém pode me ajudar? A versão do Primefaces é a 2.2.1.

Desde já agradeço.

8 Respostas

A

andersonfs,

Passei por esse mesmo problema, infelizmente essa última versão do primefaces (2.2.1 e também a 3.0M1) possui um bug no lazy load, com a primeira página.
Você pode conferir aqui: http://code.google.com/p/primefaces/issues/detail?id=1526
O bug acontece na primeira página, tenta dá um sort, ou ir pra outra página que verá o resultado.

andersonfs

Putz… e no meu caso nem os botões da paginão estão aparecendo. Dai não consigo nem ir para a próxima página.

Qual foi a solução de paginação que você usou então? Podes falar?

Te agradeço.

Abs

A

Vi que está faltando o total de registros da tabela:

@Override public List<Classe> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) { List<Classe> classes = remote.findAllClasses(pageSize, first); return classes; };

faltou o rowCount:

teuLazyDataModel.setRowCount(dao.recuperarTotatRegistros());

Sendo assim a tabela vai calcular a quantidade de páginas. Em relação ao bug, não resolvi, estou esperando a correção deles que está prevista ainda para essa 3.0. Mas como eu te disse, ao paginar ou realizar um “sort” os registros aparecem.

A

Outra coisa você disse: “remote é um EJB” e está sendo chamado no construtor, isso teoricamente não funciona, já que no construtor não vai acontecer a injeção de dependência do EJB, então remote estaria null. Uma boa prática é criar um método anotado com @PostConstruct (javax.annotation.PostConstruct, que diz que sempre será chamado ao construir o bean).

Poderia usar tipo:

@PostConstruct
    public void carregarLazyDataModel() {
       
   //carregar o lazy datamodel

    }

e o managedbean deve está com scopo de view.

andersonfs

ayslanms

Funcionou!

Em partes… os registros foram carregados na tabela, mas os botões de paginação não foram. Os seus ai aparecem?

Abraços.

A

Aparecem sim, tenta debugar para ver se o dao trás a quantidade de os resultados esperados.

andersonfs

ayslanms

Ele está trazendo os registros certos, eu passei o start e o pageSize para o EJB que executa a consulta, e lá eu fiz da seguinte forma:

No EJB

public List<Classe> findAllClasses(int pageSize, int first) {
		final StringBuilder sql = new StringBuilder(
				"Select c from Classe c order by codigo");
		final Query query = entityManager.createQuery(sql.toString());
		query.setFirstResult(first);
		query.setMaxResults(pageSize);
		final List<Classe> lista = query.getResultList();
		return lista;
}

Ele trouxe dex registros, pois foi esse o tamnho da página.

Mas não exibe os botões de paginação.

Para exibir basta fazer da seguinte forma não é mesmo:

<p:dataTable var="classe" 
				value="#{classeManagedBean.lista}"
				paginator="true" 
				rows="10"
				selectionMode="single"
				lazy="true" dynamic="true"
				paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                rowsPerPageTemplate="5,10,15"
				emptyMessage="#{msg.classe_tabela_vazia}">

Eu preciso configurar algo a mais?

Agradeço pelo apoio.

A

e a query do rowCount, que é a quantidade total de registros.

Criado 18 de abril de 2011
Ultima resposta 19 de abr. de 2011
Respostas 8
Participantes 2