página vem antes da ação no JSF ?!

9 respostas
muldon

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 ?

9 Respostas

R

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.

juliofsn

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.

muldon

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.

muldon

ninguem ? Nenhuma ideia ?

Priuli

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…

muldon

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…

muldon

pessoal, é normal nao conseguir obter um bean injetado pelo spring ( por exemplo de um servico ) no construtor do back bean ?

Priuli

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…

muldon

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 ?

Criado 21 de setembro de 2010
Ultima resposta 26 de out. de 2010
Respostas 9
Participantes 4