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

24 respostas
Hebert_Coelho

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

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.

Hebert_Coelho

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

alias

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

Hebert_Coelho

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.

Hebert_Coelho

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?

Hebert_Coelho

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.

Hebert_Coelho

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

joaoorso

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 !

Hebert_Coelho

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

Seu MB está como?

joaoorso

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 !

joaoorso

Não é :cry:

Coloquei o primefaces-3.2-SNAPSHOT.jar

e Deu o mesmo erro !

I agora ? :roll:

Hebert_Coelho

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

joaoorso

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 ?

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

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);
Hebert_Coelho

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

joaoorso

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
Hebert_Coelho

É 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.

=/

joaoorso

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 ?

Hebert_Coelho

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í! ^^

joaoorso

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