Paginacao com richFaces

17 respostas
L

Alguem ja fez paginacao de resultados com <rich:datascroller…> do richFaces + hibernate?
o que eu preciso e que meu metodo traga 100 resultados paginados dez por pagina,e quando chegar na ultima pagina do <rich:datascroller…> ele va no servidor e traga + 100 resultados.
Alguem tem uma ideia?
Obrigado

17 Respostas

G

Eu já fiz.

É bem tranquilo. Qual sua dúvida?

Você só precisar passar o método do seu MB que retorna a lista, o máximo de resultados por página,
o id de sua tabela, e a propriedade do bean que armazena a página atual.

L

Como vou saber a pagina atual?vc nao teria um exemplo disso?
Meu dataScroller ta assim:

&lt;rich:datascroller align="center" for="tbprodnum" maxPages="20"style=" width : 600px;" /&gt;

Está funcionando corretamente porem ele vai preencher tds as vinte paginas se tiverem dados eu exibir somente 5paginas com 15 linhas cada e ao usuario chegar na ultima pagina ele fosse no servidor e retornasse os proximos resultados e assim sucessivamente.

G

Veja bem, a dataScroller trabalha em conjunto com uma dataTable, certo? Então fica assim:

25 Resultados por página, trazendo da lista meusPedidos

<rich:dataTable value="#{MeusPedidos.meusPedidos}" var="pedido" id="tabL"  rows="25">

Paginação exibindo no máximo 9 indices por página, renderIfSinglePage ( Mostrar se tiver menos de 25 resultados, coloquei como falso)
page é meu bean, onde vai armazenar a página atual, um simples private int pagina com getter e setter

<rich:datascroller align="left" for="tabL" maxPages="9"
renderIfSinglePage="false" page="#{MeusPedidos.pagina}" id="sc2" />
L

blz esta parte entendi,mas em que momento entra o hibernate na jogada?Pois quero que sejam carregados os resultados ja paginados do servidor,usando .setMaxResults(10). setFirstResult(index) do hibernate,entao como vou saber qdo estou na ultima pagina do scroller para chamar o metodo que popula o DataModel novamente??
obrigado t+.

G

Esquece o setMaxResults e o setFirstResult, e passa a list completa.

Quem vai fazer esse gerenciamento vai ser o JSF.

L

Mas supondo que eu tenha 10.000 registros ele nao vai trazer os 10.000 de uma só vez?

G

Eu também tinha um receio quanto a isso, mais após a implementação percebi que ele gerencia os registros para vc.

Fiz um teste com 20 mil registros, separando 25 registros por páginas, e 9 indices por tela.
Por enquanto o desempenho que estou tendo está sendo satisfatório.

L

beleza entaum velho vou fazer uns testes aqui,muito obrigado pelas dicas t+.

M

Tenta assim:

No action do data scroler chame um método e coloque o código

HtmlDatascroller htmlDatascroller = (HtmlDatascroller) FacesContext.getCurrentInstance(). getViewRoot().findComponent("idDataScroler"); if (htmlDatascroller.getPage() = 10) { //atualize seu dataModelList buscando mais registros }

Abraços,

L

maurenginaldo:
Tenta assim:

No action do data scroler chame um método e coloque o código

HtmlDatascroller htmlDatascroller = (HtmlDatascroller) FacesContext.getCurrentInstance(). getViewRoot().findComponent("idDataScroler"); if (htmlDatascroller.getPage() = 10) { //atualize seu dataModelList buscando mais registros }

Abraços,

maurenginaldo fiz desta maneira que tu disse e nao funcionou nao veja o codigo:

public DataModel Paginacao(){
		 System.out.println("chamou o metodo..................:");
	    HtmlDatascroller htmlDatascroller = (HtmlDatascroller) FacesContext.getCurrentInstance().  
	    getViewRoot().findComponent("scrollnum");  
	   if (htmlDatascroller.getPage()== 5) {  
		   System.out.println("valor do scroller.....:"+htmlDatascroller.getPage() + 4);
	     IDaoNumeracao idao =new DaoNumeracao();
	     model =(DataModel) idao.ListarTodosPaginados(htmlDatascroller.getPage() + 4);
	     return model;
	   }  	
	return null;
}





<rich:datascroller id="scrollnum" align="center"  for="tbnumeracao" 
			maxPages="5" style=" width : 739px;"  
			page="#{numeracao.indexPage}"  onpagechange="#{numeracao.Paginacao}"/>

Tentei chamar via action,onPageChange mas ele naum chama o metodo,vc tem alguma ideia do que seja?
obrigado,abracos.

M

Faça um debug e verifique se quando o rich scroler muda de página ele chama o método getDataModelList do dataTable.
Se sim, na chamada desse método faça a verificação da página e busque mais dados.

Outra mudança seria o maxPages do data scroler, vc vai ter que colocar ele em uma váriavel no seu bean, para quando sua lista aumentar, você também aumenta ele.

Qualquer dúvida poste aí.

Abraços,

L

Cara dei uma modificada esta funcionando,executa a consulta mas nao renderiza o datascroller qdo chego no maximo de paginas,de uma olhada no codigo:

public DataModel Paginacao(){  
		         System.out.println("chamou o metodo..................:");  
		         HtmlDatascroller htmlDatascroller = (HtmlDatascroller) FacesContext.getCurrentInstance().    
		         getViewRoot().findComponent("scrollnum");    
		         System.out.println("getIndexPage..................:"+getIndexPage()+1); 
		         if ((getIndexPage()+1)== getMaxPages()) { 
		        	System.out.println("getIndexPage..................:"+getIndexPage()+1); 
		        	System.out.println("MaxPage..................:"+getMaxPages());
		            setMaxPages(maxPages + 5);
		            System.out.println("MaxPages..................:"+getMaxPages());
		            
		            IDaoNumeracao idao =new DaoNumeracao();  
		          model =(DataModel) new ListDataModel(idao.ListarTodosPaginados( ( getIndexPage()+1 )*10) );  
		          setModel(model);
		        
		          return model; 
		          
		        }  
		         setMaxPages(5);
		     return null;  
		 }

e o metodo no dao

@SuppressWarnings("unchecked")
	public List&lt;Numeracao&gt; ListarTodosPaginados(Integer index) {
		session = HibernateUtil.getInstance();
		 try{
		 List&lt;Numeracao&gt; list =session.createQuery("from Numeracao n order by n.numeracaoid")
		 .setFirstResult(index).setMaxResults(50).list();
		 return list;
		 } finally {
	        	session.close();
	        }
		
	}

o scroller

&lt;a4j:outputPanel ajaxRendered="true"&gt;
			 &lt;rich:datascroller id="scrollnum" align="center"  for="tbnumeracao"   
             maxPages="#{numeracao.maxPages}" style=" width : 739px;" ajaxSingle="true"   
             page="#{numeracao.indexPage}"  action="#{numeracao.Paginacao}"/&gt; 
         &lt;/a4j:outputPanel&gt;

Obrigado t+ abraços.

M

Bom,

testa colocando o reRender no data scroler para ele mesmo reRender=“idDataScroler” ou no dataTable.

L

Blz funcionou,ta dando uns probleminhas na atualizacao mas vou dar uma olhada com + calma depois posto as duvidas,valew amigo mto obrigado pela ajuda t+.

R

Olá lgweb,

Você precisará implementar paginação sob demanda, se não me engano no fórum da JBoss tem um exemplo prontinho para Richfaces+JPA/Hibernate. Dá uma olhada lá.

Olá Gbzao,

Gbzao!:
Eu também tinha um receio quanto a isso, mais após a implementação percebi que ele gerencia os registros para vc.

Fiz um teste com 20 mil registros, separando 25 registros por páginas, e 9 indices por tela.
Por enquanto o desempenho que estou tendo está sendo satisfatório


Se você realmente quer derrubar tua aplicação, você está indo pelo caminho certo! Para um único usuário ou alguns poucos você não encontrará problemas, mas quanto maior o número de usuários acessando tua aplicação maior será o consumo de memoria do servidor, logo em pouco tempo sua aplicação vem abaixo.

E sobre performance, certamente que é algo rápido, pois todos os dados estão em memoria. Utilize paginação sob demanda, é o melhor que você faz.

T

Podia passar o link pra gente não consegui achar .

T

Para gerar a lista que você setou na listDataModel, você inicializou uma List com 50 posições, de maneira que seu datascroller fosse renderizado com 5 páginas, em uma paginação de 10 linhas, por exemplo, e nessa lista, teriam 10 objetos nas primeiras posições no caso da primeira página, e outros 40 objetos vazios ? Ou há alguma outra maneira de fazer o dataScroller ser renderizado com n páginas por exemplo, alguma maneira que eu não precise inicializar uma lista com o número de registros para que seje renderizado as n páginas no componente ?

Criado 17 de junho de 2008
Ultima resposta 30 de set. de 2008
Respostas 17
Participantes 5