Paginação por demanda com PrimeFaces M4

15 respostas
C

Pessoal, faz um bom tempo que estou tentando fazer uma paginação por demanda na tabela com o primeFaces M4 e não estou conseguindo. Ja usei o exemplo que tem lá no showCase, mas nesse exemplo carrega todos os dados do banco e eu quero que carregue uma determinada quantidade. Por favor, se alguém tiver algum exemplo me ajude.

15 Respostas

Hebert_Coelho

Pq vc está utilizando a M4?

Pq vc não usa a versão final que já foi lançada?
http://primefaces.org/downloads.html

C

Posso até mudar, mas igual nao sei como fazer a paginação por demanda. Se tiver algum exemplo, por favor, posta ou me manda: [email removido]. Obrigado.

M

posta seu codigo ai

C

Eu não sei como buscar lá no DAO os registros ja páginados, e depois como chama-lo no bean.

Hebert_Coelho

Posta o que você tentou fazer.

fabiozanardi

sera que o que você está querendo fazer é o lazy mode?

C
Vou postar por partes: Meu bean:
private LazyDataModel<Carreta> lazyModel;

public CarretaMBean() {
		listaCarreta = new ArrayList<Carreta>();
		lazyModel = new LazyCarretaDataModel(listaCarreta);
	}
E o LazyCarretaDataModel:
public LazyCarretaDataModel(List<Carreta> datasource) {
		this.datasource = datasource;
		setRowCount(this.datasource.size());
	}

	@Override
	public Carreta getRowData(String rowKey) {
		for (Carreta carreta : datasource) {
			if (carreta.getCodigocarreta().equals(rowKey))
				return carreta;
		}

		return null;
	}

	@Override
	public Object getRowKey(Carreta carreta) {
		return carreta.getCodigocarreta();
	}

	@Override
	public List<Carreta> load(int first, int pageSize, String sortField,
			SortOrder sortOrder, Map<String, String> filters) {
		List<Carreta> data = new ArrayList<Carreta>();

		// filter
		for (Carreta carreta : datasource) {
			boolean match = true;

			for (Iterator<String> it = filters.keySet().iterator(); it
					.hasNext();) {
				try {
					String filterProperty = it.next();
					String filterValue = filters.get(filterProperty);
					String fieldValue = String.valueOf(carreta.getClass()
							.getField(filterProperty).get(carreta));

					if (filterValue == null
							|| fieldValue.startsWith(filterValue)) {
						match = true;
					} else {
						match = false;
						break;
					}
				} catch (Exception e) {
					match = false;
				}
			}

			if (match) {
				data.add(carreta);
			}
		}

		// sort
		if (sortField != null) {
			Collections.sort(data, new LazySorter(sortField, sortOrder));
		}

		// rowCount
		int dataSize = data.size();
		this.setRowCount(dataSize);

		// paginate
		if (dataSize > pageSize) {
			try {
				return data.subList(first, first + pageSize);
			} catch (IndexOutOfBoundsException e) {
				return data.subList(first, first + (dataSize % pageSize));
			}
		} else {
			return data;
		}
	}
XHTML:
<p:dataTable id="dtCarreta" value="#{carretaMBean.lazyModel}" lazy="true" var="item" paginator="true" rows="5"
                             emptyMessage="#{msgs.dtVazia}" rowsPerPageTemplate="5,10,15" selection="#{carretaMBean.selectedCarretas}"
                              rowStyleClass="#{empty rowIx or rowIx mod 2 ne 0 ? 'even-row' : 'odd-row'}"
                             rowIndexVar="rowIx" rowKey="#{item.codigocarreta}">
            ........
            </p:table>

É isso que fiz ate agora.

C
Pessoal agora esta paginando por demanda, mas nao esta funcionando os sortBy e os filterBy, da um erro assim:
21:56:50,094 ERROR [stderr] (http--127.0.0.1-8080-2) javax.faces.application.ViewExpiredException: viewId:/cadastroCarreta.jsf - A exibição de /cadastroCarreta.jsf não pôde ser restaurada.

21:56:50,094 ERROR [stderr] (http--127.0.0.1-8080-2) 	at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:200)

21:56:50,094 ERROR [stderr] (http--127.0.0.1-8080-2) 	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

21:56:50,094 ERROR [stderr] (http--127.0.0.1-8080-2) 	at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:111)

21:56:50,095 ERROR [stderr] (http--127.0.0.1-8080-2) 	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)

21:56:50,095 ERROR [stderr] (http--127.0.0.1-8080-2) 	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)

21:56:50,095 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)

21:56:50,095 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)

21:56:50,095 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67)

21:56:50,095 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)

21:56:50,095 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)

21:56:50,096 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)

21:56:50,096 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)

21:56:50,096 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139)

21:56:50,096 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57)

21:56:50,096 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:49)

21:56:50,096 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154)

21:56:50,097 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

21:56:50,097 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

21:56:50,097 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362)

21:56:50,097 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)

21:56:50,097 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667)

21:56:50,097 ERROR [stderr] (http--127.0.0.1-8080-2) 	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952)

21:56:50,098 ERROR [stderr] (http--127.0.0.1-8080-2) 	at java.lang.Thread.run(Thread.java:619)
O meu Bean:
@PostConstruct
	private void init() {
		lazyModel = new LazyDataModel<Carreta>() {
			@Override
			public List<Carreta> load(final int first, final int pageSize, final String sortField, final SortOrder sortOrder,
					final Map<String, String> filters) {

				final List<Carreta> toReturn = carretaService.getListaPaginado(first, pageSize);

				if (ehParaContar) {
					rowCount = carretaService.count();
					lazyModel.setRowCount(rowCount);
					ehParaContar = false;
				}
				return toReturn;
			}
		};
		rowCount = carretaService.count();
		lazyModel.setRowCount(rowCount);
	}
DAO
public int count() {
        Long resultado = new Long(0L);
        Query query = getSession().createQuery("select count(e) from Carreta e" );
        resultado = (Long) query.uniqueResult();
        return resultado.intValue();
    }

    @SuppressWarnings("unchecked")
    public List<Carreta> getListaPaginado(int inicio, int quantidade) {
        Session ses = getSession();
        Query query = ses.createQuery("SELECT e FROM Carreta e").setFirstResult(inicio).setMaxResults(quantidade);

        List<Carreta> lista = (List<Carreta>) query.list();
        return lista;
    }

Alguém tem ideia do que pode ser?

Hebert_Coelho

Cara, esse erro acontece quando a sessão acaba ou então vc faz um restart no seu servidor por alteração de código, por exemplo.

Procure na net aí que tem modos de tratar esse erro.

O modo mais fácil é sempre abrir uma aba nova.

C

O erro foi resolvido mas os sortBy e os filterBy nao funcionam. Alguém já fez isso com paginação por demanda?

E

clever:
O erro foi resolvido mas os sortBy e os filterBy nao funcionam. Alguém já fez isso com paginação por demanda?
Viu que o método load tem esses 3 parâmetros no final?

final String sortField, final SortOrder sortOrder, final Map<String, String> filters

C

Eu vi mas não tenho ideia de como implementar o método para furcionar…

E

dá uma “olhada” no que esses parâmetros tem.

Faz assim, no p:column, inclua os parâmetros “sortBy” e “filterBy”, esses parâmetros que passar no sortBy e FilterBy do p:column, verifica como os resultados são passados para os parâmetros. O SortBy é uma String com o nome da coluna (informada no sortBy do p:column), o sortOrder você compara com SortOrder.ASCENDING, DESCENDING ou um outro que não lembro. O FilterBy vai ter um Map com o key igual ao nome da coluna informado no p:column pelo parâmetro filterBy, e o value igual ao texto digitado pelo usuário na caixa de edição.

C

A sim, entendi o esquema. Mas vc nao tem um exemplo pra mim da uma olhada? Se nao quiser postar aqui envia por email: [email removido]

Obrigado.

drcosta

Ola pessoal, conseguiram resolver o problema? Vocês poderiam postar um exemplo da paginação sobre demanda?

Obrigado!

Criado 18 de dezembro de 2011
Ultima resposta 8 de mar. de 2013
Respostas 15
Participantes 6