Fala galera,
Gostaria de saber a melhor prática para setar uma lista do meu managed bean, exemplo:
public class ExemploHandler {
private List<Object> minhaLista;
public List<Object> getMinhaLista() {
return minhaLista;
}
public void setMinhaLista(List<Object> minhaLista) {
this.minhaLista = minhaLista;
}
}
Aonde eu devo fazer a chamada para um método que faria a consulta no banco e “alimentaria” essa lista, ja vi alguns exemplos em que a lista é populada diretamente no “get”, e algumas recomendações de que devo chamar um método “void” que faria esse load…qual seria a melhor prática para isso?
Agradeço antecipadamente!
Até onde eu sei a chamada pode ser feita no próprio método get … não vejo nenhum motivo específico ou vantagem que faça você criar um outro método void só pra isso.
public List<Object> getMinhaLista() {
minhaLista = MinhaListaDao.getAll();
return minhaLista;
}
[quote=Joaozava]Até onde eu sei a chamada pode ser feita no próprio método get … não vejo nenhum motivo específico ou vantagem que faça você criar um outro método void só pra isso.
public List<Object> getMinhaLista() {
minhaLista = MinhaListaDao.getAll();
return minhaLista;
}
[/quote]
Não coloque no get, pois o JSF não garante que o get será chamado somente uma vez. Neste caso a chamada ao banco poderia ser executada várias vezes. Crie um método para popular a lista antes de acessá-la ou a popule no Construtor caso não seja uma lista dinâmica.
Dê uma olhada nesse post: http://www.guj.com.br/posts/list/108559.java e nesse site: http://www.jsf-faq.com/faqs/faces-misc.html
andrepestana obrigado pela resposta!
Chamar um método no construtor resolveria parte do problema apenas, mas sem dúvida já foi um grande passo.
Se tiver outras sugestões eu agradeço cara!
Muito obrigado, abraços!
[quote=andrepestana][quote=Joaozava]Até onde eu sei a chamada pode ser feita no próprio método get … não vejo nenhum motivo específico ou vantagem que faça você criar um outro método void só pra isso.
public List<Object> getMinhaLista() {
minhaLista = MinhaListaDao.getAll();
return minhaLista;
}
[/quote]
Não coloque no get, pois o JSF não garante que o get será chamado somente uma vez. Neste caso a chamada ao banco poderia ser executada várias vezes. Crie um método para popular a lista antes de acessá-la ou a popule no Construtor caso não seja uma lista dinâmica.
Dê uma olhada nesse post: http://www.guj.com.br/posts/list/108559.java e nesse site: http://www.jsf-faq.com/faqs/faces-misc.html
[/quote]
opa, na verdade nunca tinha pensado nisso… mas é verdade, debugando já vi várias vezes o mesmo método ser chamado mais de uma vez…
Mas no caso de ser uma lista dinânica, existe alguma solução para que não seja chamado o método de consulta mais de uma vez?
Você também pode usar a anotação @PostConstruct.
Tipo:
@PostConstruct
private void loadMinhaLista() {
minhaLista = MinhaListaDao.getAll();
}
Aí sempre que o MB for construido (inclusive com as instancias de outros atributos), sua lista será carregada e seu get ficará limpo:
public List<Object> getMinhaLista() {
return minhaLista;
}
Essa anotação só funciona com com JSF 1.2!
Veja o artigo abaixo:
JSF 1.2 RI - Bean Instantiation and Annotations
http://weblogs.java.net/blog/jhook/archive/2007/05/jsf_12_ri_backi.html
[]'s
[quote=Joaozava][quote=andrepestana][quote=Joaozava]Até onde eu sei a chamada pode ser feita no próprio método get … não vejo nenhum motivo específico ou vantagem que faça você criar um outro método void só pra isso.
public List<Object> getMinhaLista() {
minhaLista = MinhaListaDao.getAll();
return minhaLista;
}
[/quote]
Não coloque no get, pois o JSF não garante que o get será chamado somente uma vez. Neste caso a chamada ao banco poderia ser executada várias vezes. Crie um método para popular a lista antes de acessá-la ou a popule no Construtor caso não seja uma lista dinâmica.
Dê uma olhada nesse post: http://www.guj.com.br/posts/list/108559.java e nesse site: http://www.jsf-faq.com/faqs/faces-misc.html
[/quote]
opa, na verdade nunca tinha pensado nisso… mas é verdade, debugando já vi várias vezes o mesmo método ser chamado mais de uma vez…
Mas no caso de ser uma lista dinânica, existe alguma solução para que não seja chamado o método de consulta mais de uma vez?
[/quote]
Eu acho que não tem como ele não ser chamado mais de uma vez. O que vc deve fazer é carregar a lista toda vez que precisar fora do get.
Eu faço assim: Tenho uma página página que lista os objetos e outra que edita. Crio dois métodos que representam a minha ação no managedBean: public String listar() e public String editar(). No método listar eu carrego minha lista e mando para a página de listagem de objetos. Agora vamos supor que o meu objeto tenha uma lista com objetos filhos. Para buscar os objetos filhos eu faço uma busca no banco pelo id do objeto pai. Então no método editar eu pego o objeto selecionado, busco a lista de objetos filhos, carrego minha lista de objetos filhos e mando para a página de edição.
Entendeu?
Abraço,
dansouza fiz alguns testes aqui e funcionou como você disse, nem imaginava que poderia ser feito com annotations, vou estudar isso, mas de antemão lhe agradeço muito!
andrepestana boa alternativa essa cara, só fazia isso para edição, para telas tipo formulario eu nunca chamava nenhum método do bean, só as propriedades mesmo…isso também resolveria esse problema de não ter que chamar nada no get.
Valew galera!, muito obrigado!