pessoal estou iniciando no JSF e tenho uma dúvida que acredito ser uma dúvida de muitos. Quando acionamos uma URL no JSF o fluxo nos direciona a uma página e não a uma ação para depois uma página. como é o caso do struts. Como entao eu faco meu Back Bean popular um combo por exemplo se a página vem antes da ação ?
página vem antes da ação no JSF ?!
9 Respostas
Não necessariamente redireciona a uma página.
Vc pode perfeitamente invocar uma action:
<h:commandButton action="#{meuBean.meuMetodo}">
e depois de executar a lógica do método ai sim direcionar pra página.
Imagine que você tem um ArrayList de Produtos no seu backing bean:
private ArrayList<Produto> produtos;
public ArrayList getProdutos()
{
return produtos;
}
De forma bem simplificada, você pode preencher um combo box assim:
<c:forEach var="produto" items="${produtos}" >
<option value="${produto.codigo}">${produto.descricao}</option>
</c:ForEach>
Há outras formas bem melhores, dependendo da biblioteca de componentes que você estiver usando, mas o básico é isso aí. É importante perceber que apesar de acessar “produtos”, ele na verdade está chamando o método getProdutos do backing bean.
pessoal nao sei se me expressei bem, vou tentar novamente. O problema é quanto ao fluxo do JSF. Eu entrei na página, digamos minha página HOME. Como é feito no jsf para que nessa página HOME já venha meu combo populado ?
<h:commandButton action="#{meuBean.meuMetodo}">
tudo bem isso me daria uma acao para popular o combo. Mas eu teria que pressionar o botao, ou o link, ou ENFIM o evento ! Eu quero já trazer o combo populado sem precisar passar pelo construtor do meu back bean, pois nesse momento eu nao teria acesso ao contexto do spring. É como se tivesse um método init() que por exemplo seria executado toda vez q eu invocasse essa página antes de mostrá-la.
ninguem ? Nenhuma ideia ?
no seu construtor do backbean vc carrega a sua lista…
ex:
public calss MeuBean{
private List<SelectItem> comboPopulado ;
public MeuBean(){
this.comboPopulado = WebUtils.toSelectItem( meuDAO.listCombosPopulados());
}
//get and sets
}
quando o backbean for instanciado ele já carrega a sua lista, ou então no seu metodo get você pode carregar a lista tb… isso funcionaria para escopo de request mais de sessao não mudaria muito…
humm obrigado Priuli, eu acabei resolvendo utilizando o keepAlive para aumentar o escopo do Back Bean e nao precisar ir no banco a cada request para recuperar a lista. Alem disso no momento de criacao da lista nao consegui obter o contexto do spring, ou seja, os beans de servico injetados…
pessoal, é normal nao conseguir obter um bean injetado pelo spring ( por exemplo de um servico ) no construtor do back bean ?
Cara já tive este problema com o @Autowired do spring, quando adicionava @Autowide em um contrutor de uma classe com anotation @Service ele não conseguia injetar, pelo construtor ai eu mudei para injetar via set (pelo metodo), porem para classes com a anotação @Component o spring injetava de boa pelo construtor…
Eu não me aprofundei para solucionar o problema, pois estava sem tempo e tinha que entregar o projeto o quanto antes ai resolvi trocando para injetar via gets and setrs…
eu uso via getter e setter, fazendo um autowire by name. Mas no momento do construtor do Back Bean ainda nao foi feita a injecao. Como resolver isso ?