(JSF) Método no Controller sendo chamado + de 10 vezes oO

5 respostas
sandro.csimas

Pessoal, em uma página tenho um a4j:repeat iterando um dataModel
para cada linha eu tenho um commandLink que tem um rendered com uma condição, chamando um método que precisa ir no banco verificar alguma coisa.
Quando em uma linha, clico neste commandLink, eu peço para renderizar apenas a propria linha para que outro commandLink apareca no lugar do antigo.
Acontece é que o método é chamado mais de 10 vezes, sendo que na pagina soh tem duas referencias para o mesmo, com isso a consulta no banco pela mesma coisa acontece muitas vezes.
Como posso evitar isso ?

Exemplo:

View

<a4j:repeat value="avisoAtividadeController" var="item">
    <a4j:outputPanel id="row">
        <h:outputText value="#{item.autor.nomeExibicao}"/>
        <a4j:commandLink id="starred" rendered="#{avisoAtividadeController.avisoFavoritado}" action="#{avisoAtividadeController.favoritarAvisoLinha}" reRender="starred,unstarred"/>
        <a4j:commandLink id="unstareed" rendered="#{!avisoAtividadeController.avisoFavoritado}" action="#{avisoAtividadeController.desfavoritarAvisoLinha}" reRender="starred,unstarred"/>
    </a4j:outputPanel>
</a4j:repeat>

Controller

public class AvisoAtividadeController {
    ...
    ...

    public String favoritarAvisoLinha(){
        AvisoAtividadeContato aviso = (AvisoAtividadeContato) dataModel.getRowData();
        // insert no banco
    }


    public String desfavoritarAvisoLinha(){
        AvisoAtividadeContato aviso = (AvisoAtividadeContato) dataModel.getRowData();
        // delete no banco
    }

    public boolean isAvisoFavoritado(){
        AvisoAtividadeContato aviso = (AvisoAtividadeContato) dataModel.getRowData();
        ...
        // consulta banco
        return true/false;
    }
}

só existem duas referencias no jsp pro isAvisoFavoritado, porém é chamado mais de 7 a 14 vezes cada linha

5 Respostas

lucasluiz

Cara da uma olhada nesse post
O JSF tem um esquema de ciclo de vida diferente dos frameworks action based.

http://marcusmazzo.wordpress.com/2008/12/13/ciclo-de-vida-jsf/

Qualquer dúvida ou se não conseguir entender mesmo vendo o Post só chama q estamos aeh …
mais acredito q esse post vai ser bem esclarescedor …

sandro.csimas

Obrigado pela atenção Lucas, acontece que nesse metodo eu verifico a linha corrente no banco.
Eu nao posso guardar o retorno do metodo numa variável global porque quando trocar de linha ela teria que mudar.
Tem alguma ideia ? Valeu

lucasluiz

Cara desculpa mesmo a demora pra voltar a responder,
a coisa ficou feia aqui no trabalho, então me responde uma coisa, este seu bean esta com que escopo ?

sandro.csimas

Ele precisa ser Request, ou algo com o tempo de vida maior do que este…
Utilizei o keepAlive do RichFaces, porém continua chamando muitas vezes.
Acredito que seja das fases do JSF mesmo, não curti muito isso hehe

lucasluiz

Se você estiver na versao 2.0 do JSF vc pode usar o ViewScope pra ter um escopo intermediário entre Session e Request.
Se usar a viewscope vc pode gerenciar uma propriedade do ManagedBean e quando salvar ou editar vc pode persistir os dados e da sua lista no DB.

pelo menos eu acredito ser a solução mais simples.

Criado 11 de novembro de 2010
Ultima resposta 30 de nov. de 2010
Respostas 5
Participantes 2