Paginação

Abaixo está descrito, passo a passo, como realizar paginação de listagens em Struts e em JSF.

Struts

1. Antes de realizar a busca, deve-se configurar o DAO para informar os dados da paginação:

navegaPagina(dao, form);
convenioDAO.setPaginable(true); 
convenioDAO.setPageSize(15); // Tamanho da página
convenioDAO.setPageNum(form.getPageNum()); // Página atual

2. Dentro do DAO, deve-se executar uma consulta para retornar o total de registros da listagem e alterar a consulta original para trazer apenas os dados da página atual, conforme o código abaixo.

Query q = getSession().createQuery("from Entidade");
 
if (isPaginable()){
	if (getCount() == 0) {
		Query count = getSession().createQuery("select count(*) from Entidade");
		setCount(((Long) count.uniqueResult()).intValue());
	}
 
	q.setFirstResult(((getPageNum() - 1) * getPageSize()));
	q.setMaxResults(getPageSize());
}
return q.list();

3. Após colocar o código da consulta na action, salvar os dados da paginação conforme o código abaixo:

List<Entidade> lista = dao.findAll();
setAttributePaginacao(req, dao);
req.setAttribute("paginable", "true");
req.setAttribute("lista", lista);

4. Utilizar a tag <ufrn:paginacao /> para renderizar na tela o controle da paginação.

<ufrn:paginacao action="actionParaListagem" >
       // Pode-se passar atributos hidden para se a action precisar.
</ufrn:paginacao>

JavaServer Faces

1. Acrescentar ao método em que a consulta da listagem será realizada um parâmetro do tipo PagingInformation. Se o paging for diferente de null, executar uma consulta para retornar a quantidade total de registros da listagem. Setar o total no objeto paging e modificar a consulta principal para trazer apenas os dados da página atual, conforme o código abaixo.

public List<Entidade> findByXyz(..., PagingInformation paging) {
	Query q = getSession().createQuery(hql);
	// Setar parâmetros...
 
	if(paging != null){
		Query count = getSession().createQuery(countHql);
		// Setar parâmetros...
 
		paging.setTotalRegistros(((Long) count.uniqueResult()).intValue());
		q.setFirstResult(paging.getPaginaAtual() * paging.getTamanhoPagina());
		q.setMaxResults(paging.getTamanhoPagina());
	}
 
	return q.list();
}

2. No managed bean, informar o tamanho da página utilizando o método setTamanhoPagina() e chamar o método do DAO, utilizando o método getPaginacao() para informar o parâmetro de paginação ao DAO. Ver código abaixo.

public List<Entidade> getAll(){
 
	//Define quandos itens serão exibidos
	setTamanhoPagina(40);
 
	return getDao(EntidadeDao.class).findXyz(..., getPaginacao());
}

3. Colocar na JSP o código para mudar de página:

<div style="text-align: center;"> 
    <h:commandButton image="/img/voltar.gif" actionListener="#{paginacao.previousPage}" rendered="#{paginacao.paginaAtual > 0 }"/>
 
    <h:selectOneMenu value="#{paginacao.paginaAtual}" valueChangeListener="#{paginacao.changePage}" onchange="submit()" immediate="true">
	<f:selectItems id="paramPagina" value="#{paginacao.listaPaginas}"/>
    </h:selectOneMenu>
 
    <h:commandButton image="/img/avancar.gif" actionListener="#{paginacao.nextPage}"  rendered="#{paginacao.paginaAtual < (paginacao.totalPaginas - 1)}"/>
    <br/><br/>
 
    <em><h:outputText value="#{paginacao.totalRegistros }"/> Registro(s) Encontrado(s)</em>
</div>