[RESOLVIDO]Primefaces DataTable buscando dados sem excessivamente

10 respostas
marcos1EM

Ao clicar no cammandLink alterar contido em uma das colunas do datatable, conforme a tabela abaixo, o método #{solicitacaoController.listarSolictacaoes} no value do datable é executado um número indeterminado de vezes, fazendo com que tenha problema de performance, alguém sabe como resolver? O método está sendo executado sem mandar renderizar o DataTable

<h:form id="formTabela" >

                    <p:dataTable   id="tabela" var="soli" 
                                   emptyMessage="Nenhum registro encontrado" 
                                   value="#{solicitacaoController.listarSolictacaoes}">
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="Alterar"/>
                            </f:facet>                        
                            <p:commandLink  actionListener="#{solicitacaoController.prepararAlterarSolicitacao}" value="Alterar" update=":tabView:formCad:info" oncomplete="dialogGerLivro.show()"/>
                        </p:column>                        
                        <p:column>                                
                            <f:facet name="header"  >
                                <h:outputText value="Sts"/>
                            </f:facet>
                        </p:column>  
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="N°"/>
                            </f:facet>
                            <h:outputText value="#{soli.codSolicitacao}" />
                        </p:column>                          
                        <p:column>
                            <f:facet name="header">
                                <h:outputText value="Assunto"/>
                            </f:facet>
                            <h:outputText value="#{soli.assunto}" />
                        </p:column> 
                   
                    </p:dataTable>
                </h:form>

10 Respostas

K

você está utilizando o actionEvent no seu managedBean?
ponha o atributo process="@this" no seu commandLink

Hebert_Coelho

Você colocou um if no listarSolictacaoes?

Esse comportamento é normal no jsf.

Faça algo do tipo

if(solicitacoes == null){

solicitacoes = new …

}

return solicitacoes;

marcos1EM

kleberdamasco:
você está utilizando o actionEvent no seu managedBean?
ponha o atributo process="@this" no seu commandLink

Eu estou usando o actionEvent , no entanto, colocando o process="@this" no commandLink não funcionou.

Nessa caso, vou ficar com a sugestão dada pelo Hebert, apesar de que acho que seria mais interessante se problema pudesse ser tratado na view pelo primefaces.

Obrigado.

K
a opção de process this, foi apenas para não processar seu form todo. A assinatura do seu metodo no managedBean

é retorno nome(ActionEvent evento) {

…

}

?
marcos1EM
<blockquote><div class="quote-author">kleberdamasco:</div>a opção de process this, foi apenas para não processar seu form todo. A assinatura do seu metodo no managedBean

é retorno nome(ActionEvent evento) {

…

}

?</blockquote>

Sim, está dessa forma:

public void prepararAlterarSolicitacao(ActionEvent actionEvent) { obSolicitacao = (Solicitacao) (listaSolicitacoes.getRowData()); }

K

E vc usa o objeto actionEvent?
isso não vai resolver seu problema, é apenas uma dica,
não precisar ter então, e lá no xhtml chamar o action mesmo.

marcos1EM

kleberdamasco:
E vc usa o objeto actionEvent?
isso não vai resolver seu problema, é apenas uma dica,
não precisar ter então, e lá no xhtml chamar o action mesmo.

Realmente actionEvent nem tem utililidade nesse caso, então eu troquei para o action só para testar, e continua a mesma coisa.
Ao clicar no commandLink o método no value do dataTable é chamado cerca de 20 vezes.

Hebert_Coelho

marcos1EM:
kleberdamasco:
você está utilizando o actionEvent no seu managedBean?
ponha o atributo process="@this" no seu commandLink

Eu estou usando o actionEvent , no entanto, colocando o process="@this" no commandLink não funcionou.

Nessa caso, vou ficar com a sugestão dada pelo Hebert, apesar de que acho que seria mais interessante se problema pudesse ser tratado na view pelo primefaces.

Obrigado.

Isso não é problema, é comportamento de um framework component based.

Isso é o comportamento esperado.

felipe_gdr

O que eu costumo fazer e colocar no value do datatable sempre uma propriedade, que e representada no bean por um metodo get que simplesmente retorna uma lista. O metodo que efetivamente faz a busca no banco eu coloco em um postconstruct ou entao num daqueles f:event preRenderView.

Como o Hebert disse, e da natureza do JSF chamar varias vezes o metodo que popula a tabela, por isso evite colocar consulta ao banco nesses metodos.

marcos1EM

Entendido, Obrigado pelas dicas!

Criado 23 de abril de 2013
Ultima resposta 23 de abr. de 2013
Respostas 10
Participantes 4