Problema na paginação de resultados com jsf 2.0

4 respostas
R

Olá pessoal,

Aqui estou eu novamente precisando da ajuda de vocês.

Estou tentando criar uma forma de fazer paginação de resultados de consulta ao banco com jsf2.0. Para isso, estou seguido o tutorial do seguinte link: http://balusc.blogspot.com.br/2008/10/effective-datatable-paging-and-sorting.html

O problema é que os botões que indicam a passagem de pagina(exemplo: primeira, anterior,proxima, ultima ), bem como os que indicam o numero das paginas(exemplo: 1 2 3 4 …) não estão executando a ação no MenagedBean.

Sendo assim, gostaria mais uma vez da ajuda de vocês para solucionar este problema. Não entendo, porque a ação não é executada no bean.

Segue o código do Managed Bean:

package br.com.portal.managedBeans;

import java.util.ArrayList;
import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.faces.component.UICommand;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;

import br.com.portal.dao.UsuarioDAO;
import br.com.portal.model.Usuario;
import br.com.portal.qualifier.DAOUsuario;

@Named(value="usuarioBean")
@RequestScoped
public  class UsuarioBean implements java.io.Serializable {
	
	/*Atributos do Bean*/
	private static final long serialVersionUID = -3987088943486405330L;
	protected Usuario selectedBean;
	protected List<Usuario> usuarios;
	
	@Inject @DAOUsuario
	private UsuarioDAO usuarioDAO;
	
	/*Atributos da Paginação*/
	private int totalRegistros;
	private int primeiroRegistro;
	private int numeroRegistroPorPagina;
	private int totalPaginas;		
	private int intervaloDePaginas;
	private Integer[] paginas;	
	private int paginaAtual;
	

	
	public UsuarioBean() {
		this.numeroRegistroPorPagina = 10;
		this.intervaloDePaginas = 10;
	}
	
	/* Ações de paginação*/
	public void primeiraPagina(){
		chamaPagina(0);
	}
	public void proximaPagina(){
		chamaPagina(primeiroRegistro + numeroRegistroPorPagina);	
	}
	public void paginaAnterior(){
		chamaPagina(primeiroRegistro - numeroRegistroPorPagina);
	}
	public void ultimaPagina(){
		chamaPagina(totalRegistros - ((totalRegistros%numeroRegistroPorPagina != 0)? totalRegistros%numeroRegistroPorPagina :numeroRegistroPorPagina));
	}
	public void chamaPaginaClicada(ActionEvent event){
		chamaPagina(((Integer)((UICommand)event.getComponent()).getValue()-1)*this.numeroRegistroPorPagina);
	}
	public void chamaPagina(int primeiroRegistro){
		this.primeiroRegistro = primeiroRegistro;
		consultar();
	}

	/* Metodos Get e Set dos atributos*/
	public Usuario getSelectedBean() {
		return selectedBean;
	}
	public void setSelectedBean(Usuario selectedBean) {
		this.selectedBean = selectedBean;
	}
	public List<Usuario> getUsuarios() {
		if (usuarios==null){
			consultar();
		}
		return this.usuarios;
	}
	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}
	
	// Atributos de ordenação
	public int getPrimeiroRegistro() {
		return primeiroRegistro;
	}
	public void setPrimeiroRegistro(int primeiroRegistro) {
		this.primeiroRegistro = primeiroRegistro;
	}
	public int getNumeroRegistroPorPagina() {
		return numeroRegistroPorPagina;
	}
	public void setNumeroRegistroPorPagina(int numeroRegistroPorPagina) {
		this.numeroRegistroPorPagina = numeroRegistroPorPagina;
	}
	public int getTotalRegistros() {
		return totalRegistros;
	}	
	public void setTotalPaginas(int totaPaginas){
		this.totalPaginas = totaPaginas;
	}	
	public int getTotalPaginas(){
		return totalPaginas;
	}	
	public void setTotalRegistros(int totalRegistros) {
		this.totalRegistros = totalRegistros;
	}
	public int getIntervaloDePaginas() {
		return intervaloDePaginas;
	}
	public void setIntervaloDePaginas(int intervaloDePaginas) {
		this.intervaloDePaginas = intervaloDePaginas;
	}
	public Integer[] getPaginas() {
		return paginas;
	}
	public void setPaginas(Integer[] paginas) {
		this.paginas = paginas;
	}
	public int getPaginaAtual() {
		return paginaAtual;
	}
	public void setPaginaAtual(int paginaAtual) {
		this.paginaAtual = paginaAtual;
	}

	public void consultar(){
		try{
			this.setUsuarios(usuarioDAO.consultaPorIntervalo(getPrimeiroRegistro(), getNumeroRegistroPorPagina()));			
			this.setTotalRegistros(Integer.parseInt(usuarioDAO.totalRegistroConsultaPorIntervalo().toString()));
			
		}catch(Exception erro){
			erro.printStackTrace();
		}		
		this.paginaAtual = (totalRegistros/numeroRegistroPorPagina) - ((totalRegistros-primeiroRegistro)/numeroRegistroPorPagina)+1;
		this.totalPaginas = (totalRegistros/numeroRegistroPorPagina) + ((totalRegistros%numeroRegistroPorPagina!=0) ? 1 : 0);
		int tamanhoPagina = Math.min(intervaloDePaginas, totalPaginas);
		this.paginas = new Integer[tamanhoPagina];
		int primeiraPag = Math.min(Math.max(0, paginaAtual - (intervaloDePaginas/2)), totalPaginas - tamanhoPagina);
		
		for (int i=0; i<tamanhoPagina; i++){
			this.paginas[i] = ++primeiraPag;
		}
	}	
}

Segue o código xhtml:

<h:body>
	<h:form>
		<h:dataTable value="#{usuarioBean.usuarios}" var="usuario" border="1">
			<h:column>
				<f:facet name="header">
					<h:outputText value="Codigo" />
				</f:facet>
				<h:outputText value="#{usuario.codigo}" />
			</h:column>
			<h:column>
				<f:facet name="header">
					<h:outputText value="Nome do Usuário" />
				</f:facet>
				<h:outputText value="#{usuario.nome}" />
			</h:column>
		</h:dataTable>
	</h:form>


	<h:form>
				#{usuarioBean.totalRegistros} itens encontrados
		<h:commandButton value="Primeira" action="#{usuarioBean.primeiraPagina()}" styleClass="botaoPagina" disabled="#{usuarioBean.primeiroRegistro==0}" />
		<h:commandButton value="Anterior" action="#{usuarioBean.paginaAnterior()}" styleClass="botaoPagina" disabled="#{usuarioBean.primeiroRegistro==0}" />

		<t:dataList value="#{usuarioBean.paginas}" var="pagina">
			<h:commandLink value="#{pagina}" actionListener="#{usuarioBean.chamaPaginaClicada()}" rendered="#{pagina != usuarioBean.paginaAtual}" />
			<h:outputText value="#{pagina}" escape="false" rendered="#{pagina == usuarioBean.paginaAtual}" /> 				
		</t:dataList>

		<h:commandButton value="Próxima" action="#{usuarioBean.proximaPagina()}" styleClass="botaoPagina"
			disabled="#{usuarioBean.primeiroRegistro + usuarioBean.numeroRegistroPorPagina >= usuarioBean.totalRegistros}" />
		<h:commandButton value="Última" action="#{usuarioBean.ultimaPagina()}"
			styleClass="botaoPagina" disabled="#{usuarioBean.primeiroRegistro + usuarioBean.numeroRegistroPorPagina >= usuarioBean.totalRegistros}" />

		<h:outputLabel value="Registro por Pagina: " for="registroPorPagina" />
		<h:inputText value="#{usuarioBean.numeroRegistroPorPagina}" id="registroPorPagina" size="3" maxlength="3" />
		<h:commandButton action="#{usuarioBean.primeiraPagina()}" value="Set" />
		<h:commandButton action="#{usuarioBean.proximaPagina()}" value="Clic" />
		<t:saveState value="#{usuarioBean}" />
	</h:form>
</h:body>

Desde já agradeço a ajuda.

4 Respostas

A

Cara, já que você já está utilizando xhtml, porque não agrega alguma outra bibliotec além do tomahawk para te ajduar com isso?
Primefaces, richfaces, icefaces, etc. fazem isso em uma única linha de declaração no componente da página.

olha o exemplo do prime
http://primefaces.org/showcase/ui/datatablePagination.jsf

R

Olá andre.froes,

Obrigado por responder.

Esses componentes que você citou, a paginação é feita pelo banco ou é somente em memoria?

Além disso, no caso do prime face, tem como remover esse tema, para que eu possa aplicar o a minha própria formatação no dataTable?

Obrigado.

A

tem sim

  1. você pode criar o seu tema no themeroller do jquery, lá ele estiliza todos os componentes que serão recebidos no prime:
    http://jqueryui.com/themeroller/

  2. você pode simplesmente criar do zero o seu tema também

  3. crie um tema no themeroller de acordo com o seu gosto, e depois altere os detalhes que ficaram sobrando na mão no css do primefaces que é bem mais facil.

se não me engano o primefaces faz a paginação pelo backing bean dele

R

Olá Andre,

Após realizar alguns teste, constatei que a paginação que mencionei neste post funciona quando eu uso as anotações do JSF (@ManagedBean e @RequestScoped).

Antes eu estava usando as notações @Named e @RequestScoped do CDI.

Sendo assim, você sabe me dizer por isso acontece? Por que ele não funciona quando o bean esta sendo gerencia pelo CDI?

Desde já agradeço.

Criado 17 de abril de 2012
Ultima resposta 18 de abr. de 2012
Respostas 4
Participantes 2