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.