Erro redirecionamento JSF 2

pessoal,

to com um problema ao redirecionar minha pagina para outra…

tenho essa view:

<h:form>
	   	   <p:growl showDetail="true" id="messages"></p:growl>
		   <p:panel>
		   		<h:panelGrid title="Selecione a Perfil">
		   			<h:selectOneMenu value="#{aMb.perfilSelecionado}" >
		   				<f:selectItems value="#{aMb.listaPerfil}" var="p" itemLabel="#{p.nome}" itemValue="#{p.codigo}"/>
		   			</h:selectOneMenu>
		   		</h:panelGrid>
		   		<h:panelGrid title="Acesso Restrito" columns="2">
		   			<h:outputText value="Login:" />
		   			<h:inputText value="#{aMb.usuario.login}" />
		   			<h:outputText value="Senha:" />
		   			<h:inputSecret value="#{aMb.usuario.senha}" />
		   			<p:commandButton value="Acessar" actionListener="#{aMb.teste}" update="messages"></p:commandButton>
		   		</h:panelGrid>
		   </p:panel>
	   </h:form>

e meu managedBean:

@ViewScoped
@ManagedBean(name="aMb")
public class EntradaController 
{
                private Collection<Perfil> listaPerfil;
	private Perfil perfil;
	private Long perfilSelecionado;
	private Usuario usuario = new Usuario();

                //Getter e Setter ocultos

               public String teste()
	{
		System.out.println("usuario: " + usuario.getLogin()); //passa por aqui e imprime no console
		System.out.println("senha: " + usuario.getSenha()); //passa por aqui e imprime no console
		return "principal.xhtml"; //aqui nao redireciona
	}
}

o problema está no botão, que ao clicar…não consegue redirecionar para outra view (a view principal).

Nao da erro, mas tb não muda de tela.

Alguem sabe o que pode ser?

toda vez q vc usa actionListener tem q colocar no método o evento ActionEvent, ou seja, seu método vai ficar:

[quote]public String teste(ActionEvent evt)[/quote] e no retorno dele axo que naum precisa da extensão…axo!

eu tentei com action e tambem nao deu certo.

vou tentar com o event

Para redirecionar sua página posso te indicar 2 alternativas:

A primeira seria criar um no seu faces-config.xml, porém eu não sei ao certo como fazer até pq o meu não ta funcionando. Mas eu sei que ele funciona mais ou menos da seguinte forma:

primeiro vc cria um método que retorna uma string de acordo com o resultado esperado, exemplo:

//método para chamar a página de edição de clientes após clicar no commandButtom de editar
public String editar(){
	this.setCliente(clienteSelecionado);
	if(clienteSelecionado != null)
		return "sucesso";
	else
		return "erro";
	}

depois vc cria no faces-config.xml do seu projeto uma que funciona da seguinte forma:

	<navigation-rule>											 <!-- regra de navegação -->	
		<from-view-id>/paginas/pesquisarCliente.xhtml</from-view-id>            <!-- página atual -->
		<navigation-case>										 <!-- situação de navegação -->
			<from-action>#{clienteMB.editar}</from-action>			         <!-- nomeManageBean.método que retorna a msg  -->
			<from-outcome>sucesso</from-outcome>					 <!-- menssagem de retorno -->
			<to-view-id>/paginas/editarCliente.xhtml</to-view-id> 	         <!-- página que ele deve redirecionar -->
		</navigation-case>									         <!-- fim da situação de naveção -->
		<navigation-case>
			<from-action>#{clienteMB.editar}</from-action>
			<from-outcome>erro</from-outcome>
			<to-view-id>/paginas/pesquisarCliente.xhtml</to-view-id>
		</navigation-case>
	</navigation-rule>											 <!-- fim da regra de naveção -->

PS.:eu devo estar esquecendo algum passo neste processo pq no meu projeto o redirecionamento pelo faces-config.xml não funciona! Se alguem souber me diz por favor!

A outra maneira essa eu sei que funciona pq eu estou usando ela, apesar de não saber se é uma boa prática, ela me “soa” como um pog é o redirecionamento manual, colocando no return do seu método a seguinte expressão:

return "/paginas/editarCliente.faces?faces-redirect=true";

Espero ter ajudo! :slight_smile:

em JSF2.0 naum se usa mais o faces.config para isso é direto no MB pras páginas…

Mas então, tenta colocar no seu return algo parecido com isto:

return "principal.xhtml?faces-redirect=true";   // return "suapagina?faces-redirect=true";  

Seria mais ou menos isto, não sei como vc organizou suas páginas ou então como está o seu web.xml

No botão faça assim:

<p:commandButton value="Acessar" action="#{aMb.teste}" update="messages" ajax="false"></p:commandButton>
Ou seja faça a chamada por action (e não actionlistener) e configure atributo ajax como false;
e la na saida do seu método chamador não coloque a extensão .xhtml:

public String teste()  
    {  
        System.out.println("usuario: " + usuario.getLogin()); //passa por aqui e imprime no console  
        System.out.println("senha: " + usuario.getSenha()); //passa por aqui e imprime no console  
        return "principal"; //aqui nao redireciona  
    }  

Se não precisa passar pelo método, ou seja, queira apenas abrir a página principal, pode simplesmente fazer isso:

<p:commandButton value="Acessar" action="principal" update="messages" ajax="false"></p:commandButton>

é isso.