Novo post: Paginação de Datatable Lazy com JSF (Primefaces)

24 respostas
H

Pessoal, boa tarde.

No meio da correria do TCC consegui tempo para escrever um post que poderá ajudar muitos aqui no GUJ.

Paginação de Datatable Lazy com JSF (Primefaces)

Até a próxima! \o_

24 Respostas

A

Muito legal!

Prezado jakefrog, e manter o bean com escopo request, como haviamos discutido em outro tópico, rolou?

A propósito parabéns pelo trabalho no blog.

H

alias:
Muito legal!

Prezado jakefrog, e manter o bean com escopo request, como haviamos discutido em outro tópico, rolou?

A propósito parabéns pelo trabalho no blog.

Rapaz, eu tava procurando esse tópico para ir lah responder mas tinha tanta msg no histórico que naõ achei! :oops:

Consegui fazer a paginação com o Request Scope, mas eu vi que não valia a pena. :shock:

  1. Para cada registro no datatable seria necessário um disparo no DB para fazer a consulta e trazer a informação.
  2. Seria necessário criar um phaselistener para interceptar as chamadas de cada seleção do Primefaces pois como é request ele acaba se perdendo. Esse phaselistener teria que ir realizar a chamada do action listener. #Tenso

Por isso optei por deixar em ViewScoped mesmo, tive dando uma estudada e vi que o impacto é mínimo. Vale a pena.

Valeu ae pela força. =D

A

Por que? Ele não chama o load a cada request?

H

alias:
jakefrog:

  1. Para cada registro no datatable seria necessário um disparo no DB para fazer a consulta e trazer a informação.

Por que? Ele não chama o load a cada request?

Como o cara estava como request scope ele estava perdendo referência. Aí para cada registro no datable seria necessário enviar o id para um actionListener e esse id seria carregado no DB.
Poderia ser colocado todos os dados como hidden, mas pesaria o load da tela do usuário.

Mas o problema maior mesmo seria interceptar as chamadas do primefaces, fazer ele entender que ele pode continuar com o ciclo e carregar o valor do parâmetro enviado no request.

R

Muito legal o tema,parabéns.

Só não entendi em que momento o método load é disparado,pois no método getAllPlayers() vc está apenas inicializando a lista.

H

raf4ever:
Muito legal o tema,parabéns.

Só não entendi em que momento o método load é disparado,pois no método getAllPlayers() vc está apenas inicializando a lista.

É o proprio Primefaces quem invoca! =D

Por isso deixei a consulta e as demais ações lá dentro. =D

Valeu pela força! =D

R

jakefrog:
raf4ever:
Muito legal o tema,parabéns.

Só não entendi em que momento o método load é disparado,pois no método getAllPlayers() vc está apenas inicializando a lista.

É o proprio Primefaces quem invoca! =D

Por isso deixei a consulta e as demais ações lá dentro. =D

Valeu pela força! =D

Certo,e quanto ao startingPoint e maxPerSize,como isso é incrementado?

H

raf4ever:
Certo,e quanto ao startingPoint e maxPerSize,como isso é incrementado?
Tio Primefaces toma conta disso para vc. =D
Quando o usuário clica página 4 por exemplo, ele já envia o valor inicial daquela página e quantos registros por página deve exibir! =D
Esse cara aí é uma mão na roda.

De igual modo com o sortField! [=

R

jakefrog:
raf4ever:
Certo,e quanto ao startingPoint e maxPerSize,como isso é incrementado?
Tio Primefaces toma conta disso para vc. =D
Quando o usuário clica página 4 por exemplo, ele já envia o valor inicial daquela página e quantos registros por página deve exibir! =D
Esse cara aí é uma mão na roda.

De igual modo com o sortField! [=

Homi então o negócio eh bom mesmo :smiley: :smiley:

Lembro que eu sofri um bocado pra implementar lazy loading no RichFaces no JSF 1.2 .Realmente ficou uma mão na roda agora.

E parabéns pelo blog,seus artigos são sempre bem escritos e esclarecedores.

H

Haha, é sim viu. Quando eu comecei a implementar eu vi que realmente tá muito fácil poupar memória do servidor! O.o

Valeu pela força ae! =D

J

Parabéns pelo POST !

To com um problema aqui : A paginação funciona. o FIltro também . Mas ao selecionar uma linha :

INFO: java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException: / by zero
	at org.primefaces.model.LazyDataModel.setRowIndex(LazyDataModel.java:62)
	at javax.faces.component.UIData.setRowIndexWithoutRowStatePreserved(UIData.java:485)
	at javax.faces.component.UIData.setRowIndex(UIData.java:473)
	at javax.faces.component.UIData.iterate(UIData.java:1978)
	at javax.faces.component.UIData.processUpdates(UIData.java:1253)
	at org.primefaces.component.datatable.DataTable.processUpdates(DataTable.java:537)
	at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:510)
	at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183)
	at javax.faces.component.UIData.visitTree(UIData.java:1411)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
	at javax.faces.component.UIForm.visitTree(UIForm.java:344)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
	at javax.faces.component.UIComponent.visitTree(UIComponent.java:1600)
	at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:376)
	at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:252)
	at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:183)
	at javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1229)
	at com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:78)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:126)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:785)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:649)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:483)
	at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:454)
	at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:350)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:300)
	at com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:118)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)

Já teve esse problema ?
Alguma dica de como resolver ?

Valeu !

H

Eu tive esse problema quando o ManagedBean estava como RequestScope e não ViewScope.

Seu MB está como?

J

Está como : @ViewScoped

Você teve essa mesma Exceção, que eu citei acima ?

Tô usando o primefaces-3.1.1 ví que você usou o Primefaces 3.2

Será que pode ser isso ?

Abraço !

J

Não é :cry:

Coloquei o primefaces-3.2-SNAPSHOT.jar

e Deu o mesmo erro !

I agora ? :roll:

H

Você está utilizando o código que tem lá ou criou um seu?

J

A …
não dá pra falar que é o mesmo código pois estou usando outro banco . E estou manipulando outro Bean.
Mas a Parte da view eu usei o seu exemplo .

Melhor abrir outro post pra tratar o assunto ?

H
Você fez isso aqui no seu MB?
// set the total of players
        if(getRowCount() <= 0){
            setRowCount(playerDAO.countPlayersTotal());
        }
 
        // set the page dize
        setPageSize(maxPerPage);
J

Coloquei …

public List<ClienteBean> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {  
		 List<ClienteBean> data = new ArrayList<ClienteBean>();  
		 
		 try {
			 
			if(getRowCount() <= 0){ 
				this.setRowCount(ClienteController.getInstance().getNumRegistros());
			}			
			this.setPageSize(pageSize);
H

Você tem dados retornando da consulta?
Esse cara aqui está retornando um valor maior que zero? this.setRowCount(ClienteController.getInstance().getNumRegistros());

J

Bom dia !

Está sim . Retornando o total de registros.

if(getRowCount() <= 0){
				int rowCount = ClienteController.getInstance().getNumRegistros();
				this.setRowCount(rowCount);
				System.out.println("rowCount*******************"+rowCount);
			}			

//-----------------------------------
INFO: rowCount*******************13
H

É cara, ta muito estranho isso. Eu tive esse erro quando meu MB estava como RequestScoped.

O método que está te dando o erro é:

this.rowIndex = rowIndex == -1 ? rowIndex : (rowIndex % pageSize); Nesse caso era pq o pageSize estava zerado.

=/

J

Para resolver o problema tive que sobrescrever o método setRowIndex(int rowIndex)
da sequinte forma:

@Override
    public void setRowIndex(int rowIndex) {        
        if (rowIndex == -1 || getPageSize() == 0) {
            super.setRowIndex(-1);
        }
        else{
            super.setRowIndex(rowIndex % getPageSize());
        }
    }

Aí parou de dar pau !

Mudando um pouco de assunto .
Como que agente poderia criar um DataModel Generico ?
Algo do tipo :

public class LazyGenericDataModel<T extends Bean> extends LazyDataModel<T>

O problema é chamar classes DAO diferentes . Pois não tem como fazer algo assim :

if(T instanceOf ClienteBean)
   List <T> data = ClienteDAO.getInstance().listadados(parametros)
if(T InstanceOf BancoBean)
   List <T> data = BancoDAO.getInstance().listadados(parametros)

Entendeu ?

H

Geralmente eu utilizo um DAO generico também.

Nesse caso você teria: GenericDAO.getALL(); por exemplo.
Realmente você vai ter que quebrar a cabeça legal aí! ^^

J

A … legal !
Um DAO Genérico !
Vou implementar ! certeza !

Valeu (y)

Criado 30 de março de 2012
Ultima resposta 4 de abr. de 2012
Respostas 24
Participantes 4