[RESOLVIDO] Dúvida Primefaces CommandButton, CommandLink e MenuItem

6 respostas
Gesiel_

Galera,

Tenho uma página com um gridTable que deveria já vir populado ao entrar na tela com o seguinte código:

index.xhtml (Menu com link para minha action que popula a grid)

<p:submenu label="#{messages['sis.title.menu.item.administration']}">
       <p:menuitem value="#{messages['sis.title.menu.subitem.users']}" action="#{usuarioMB.listUsuario()}" ajax="false" />
</p:submenu>

UsuarioMB.java (Aonde está a ação que popula a grid)

public String listUsuario() {
	try {
		usuarios = usuarioEJB.findAll();
	} catch (Exception e) {
		trataException(e);
	}
	return PAGE_LIST_USUARIO; // PAGE_LIST_USUARIO = "listUsuario"
}

faces-config.xml

<navigation-rule>
	<navigation-case>
		<from-outcome>listUsuario</from-outcome>
		<to-view-id>/pages/protected/admin/listUsuario.xhtml</to-view-id>
		<redirect />
	</navigation-case>
</navigation-rule>

Desse jeito, quando entro no listUsuario onde a table deveria estar preenchida ela está vazia.
Já verifiquei que ao clicar no “link” ele chama minha ação corretamente, preenchendo minha propriedade com os dados corretos, porém, ao executar o “getUsuarios()” que deveria trazer minha lista já preenchida a lista está nula, como se estivesse ocorrendo uma segunda requisição (meu MB está com RequestScope).

Também já percebi que isso está acontecendo com commandButtons e commandLinks que tenho na aplicação, eles executam minha ação mas os objetos acabam nullos quando abre a página…

Eu já tenho uma solução, que é tirar o navigation-rule do faces-config e mudar o retorno da minha ação para o caminho completo até a página xhtml. Porém não quero ficar retornando Strings enormes…

Enfim, quero saber se esse é o comportamente correto e eu que estou viajando (por que funciona assim?) ou se implementei algo errado e desse jeito deveria funcionar mesmo…

6 Respostas

Hebert_Coelho

Faz um teste e coloca seu MB como session. Veja se funciona.

Gesiel_

Como Session funciona, mas como Request e View não.
Isso ta parecendo um bug, sei lá…

Hebert_Coelho

Gesiel_:
Como Session funciona, mas como Request e View não.
Isso ta parecendo um bug, sei lá…
Pq seria bug? Isso é que não é. :stuck_out_tongue:

Request scope morre após finalizar o request, ou seja, na primeira ação você produziu o valor da lista. Quando a página vai ser “montada” uma nova chamada será executada e aquele valor do request inicial já voou a muito tempo.
View scope começa apenas quando a página final é exibida. Se você fez a chamada da página A, ao chegar na pagina B tudo já foi embora.

É por isso que com sessão funciona. ^^

O que você poderia fazer é colocar o ato de buscar a lista no DB no get.
Joga seu MB para view e faça um if:if(lista == null){ lista = METODO_Q_RETORNA_A_LISTA } return lista;Com isso, quando ele for exibir os dados o valor da lista vai sempre estar lá.
No seu botão que chama action por exemplo, você pode colocar uma navegação direta para lá sem precisar passar pelo MB.

Gesiel_

Mas qual o motivo de duas requisições? Se eu tirar o navigation-rule e retorornar uma string com o caminho até a página funciona normalmente. Não vejo motivo para a segunda requisição…

Hebert_Coelho

Isso aqui vai te ajudar a entender melhor: http://balusc.blogspot.com.br/2011/09/communication-in-jsf-20.html

Gesiel_

Muito bom jakefrog. Valeu pela ajuda.
Seu blog também já me ajudou bastante.

(Y)

Criado 29 de março de 2012
Ultima resposta 29 de mar. de 2012
Respostas 6
Participantes 2