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>