O que está errado com a regra de navegação?

6 respostas
javer

Tenho o seguinte projeto (veja a pasta view):

(Ainda tentando terminar o Login com Facelets + RichFaces)

Tenho a seguinte regra de navegação:

<navigation-rule> <from-view-id>login.jsf</from-view-id> <navigation-case> <from-action>#{mainBean.validUser}</from-action> <from-outcome>success</from-outcome> <to-view-id>/view/entrada.jsf</to-view-id> </navigation-case> <navigation-case> <from-action>#{mainBean.validUser}</from-action> <from-outcome>failure</from-outcome> <to-view-id>/login.jsf</to-view-id> </navigation-case> </navigation-rule>

Aqui o código no BB que faz a chamada de um action para mudar de página:

public String validUser() { String returnString = "success"; try { if (!usuario.getSenha().toLowerCase().equals(senhaInformada.toLowerCase())) { returnString = "failure"; setMessagem("Senha informada incorretamente."); } else { System.out.println("USUARIO LOGADO CORRETAMENTE"); // Está entrando aqui e retornando 'success' } } catch (Exception ex) { setMessagem("Erro: VALIDANDO USUARIO = " + ex.getMessage()); System.out.println("Erro: VALIDANDO USUARIO"); ex.printStackTrace(); returnString = "failure"; } return returnString; }

O código está retornando success, portanto deveria chamar a página view/entrada.xhtml, mas não está.
Alguém poderia me dizer se esqueci alguma coisa ou se fiz algo errado?

6 Respostas

anderson.bonavides

Você tem que tirar isso:

<from-action>#{mainBean.validUser}</from-action>

Se isso for a declaração do Managed Bean desconheço esta forma.

Vou postar um faces-config.xml com navegação e MB de maneira correta:

<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
                              "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
 <!-- Configuração do Managed Bean -->
 <managed-bean>
  <managed-bean-name>usuario</managed-bean-name>
  <managed-bean-class>br.com.jampasoftwaredevelopment.view.UsuarioMB</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <!-- <managed-bean-scope>session</managed-bean-scope> -->
 </managed-bean>

 <!-- Navegação de páginas -->
 <navigation-rule>
  <from-view-id>/jsp/home.jsp</from-view-id>
  <navigation-case>
   <from-outcome>Invalido</from-outcome>
   <to-view-id>/jsp/home.jsp</to-view-id>
  </navigation-case>

</faces-config>
javer

Fiz as alterações e ficou assim:

código no BB:
public String validarLogin() {
    try {
        String senhaUsuarioSelecionado = usuario.getSenha().toLowerCase();
        String senhaDigitada = senhaInformada.toLowerCase();
        System.out.println("Senha correta: " + senhaUsuarioSelecionado);
        System.out.println("Senha informada: " + senhaDigitada);
        if (!senhaUsuarioSelecionado.equals(senhaDigitada)) {
            setMessagem("Senha informada incorretamente.");
            return "failure";
        } else {
            // Está entrando aqui e retornando 'success'
            System.out.println("USUARIO LOGADO CORRETAMENTE");
            return "success";
        }
    } catch (Exception ex) {
        setMessagem("Erro validando login: " + ex.getMessage());
        ex.printStackTrace();
        return "failure";
    }
}
no faces-config.xml:
<faces-config version="1.2" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">

    <managed-bean>
        <managed-bean-name>mainBean</managed-bean-name>
        <managed-bean-class>org.trans.bean.RichFacesBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

    <application>
        <view-handler>
            com.sun.facelets.FaceletViewHandler
        </view-handler>
    </application>

    <converter>
        <converter-id>ConverterUsuario</converter-id>
        <converter-class>org.trans.converter.UsuarioConverter</converter-class>
    </converter>

    <navigation-rule>
        <from-view-id>/login.jsf</from-view-id>
        <navigation-case>
            <from-outcome>success</from-outcome>
            <to-view-id>/entrada.jsf</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>failure</from-outcome>
            <to-view-id>/login.jsf</to-view-id>
        </navigation-case>
    </navigation-rule>

</faces-config>
login.xhtml:
<ui:define name="body">
  <center>
    <h:panelGrid width="250px" columns="2" border="0">
	<rich:panel header="Conexão no #{mainBean.titulo}" style="background-color: #ebf3fd;">
	    <h:form id="LoginForm">
		<h:outputText value="#{mainBean.messagem}" style="color: red;" />
		<h:panelGrid id="lpg" columns="2" >
		    <h:outputText value="Usuário " />
		    <h:selectOneMenu id="usuarios" value="#{mainBean.usuario}">
			<f:selectItems id="usuario" value="#{mainBean.usuarios}" /> 
			<f:converter converterId="ConverterUsuario" />
		    </h:selectOneMenu>

		    <h:outputText value="Senha"/>
		    <h:inputSecret id="senha" required="true" validatorMessage="Senha entre 5 e 20 caracteres"
				   value="#{mainBean.senhaInformada}" size="20">
			<f:validateLength minimum="5" maximum="20"/>
		    </h:inputSecret>

		    <h:outputText value=""/>
		    <h:message for="senha" style="color: red;"/>

		    <h:outputText value=""/>
		    <h:commandButton value="Entrar no Sistema" action="#{mainBean.validarLogin}" styleClass="submitButton"/>
		</h:panelGrid>
	    </h:form>
	    <h:messages globalOnly="false" />
	</rich:panel>
    </h:panelGrid>
  </center>
</ui:define>

Os arquivos login.xhtml e entrada.xhtml estão no mesmo local (mesma pasta).

Não sei o que fazer para chamar essa página entrada.jsf pois não consigo ver o que estou fazendo de errado.

Alguma dica?

fabio.massa

Suas páginas são .xhtml ou .jsp?, aparentemente a chamada do método está correta, só achei estranho no seu faces-config as páginas *.jsf, tente com a extensão real das páginas.

javer
Sim, minhas páginas são .xhtml - já tentei assim também:
<navigation-rule>
        <from-view-id>login.xhtml</from-view-id>
        <navigation-case>
            <from-outcome>sucesso</from-outcome>
            <to-view-id>/pages/entrada.xhtml</to-view-id>
            <redirect/>
        </navigation-case>
        <navigation-case>
            <from-outcome>falha</from-outcome>
            <to-view-id>/login.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
...

// No xhtml
<h:commandButton value="Entrar no Sistema" action="#{mainBean.validarLogin}" />
...

// no bean
    public String validarLogin() {
        try {
            String senhaUsuarioSelecionado = usuario.getSenha().toLowerCase();
            String senhaDigitada = senhaInformada.toLowerCase();
            if (!senhaUsuarioSelecionado.equals(senhaDigitada)) {
                setMessagem("Senha informada incorretamente.");
                return "falha";
            } else {
                // Está entrando aqui e retornando 'success'
                System.out.println("USUARIO LOGADO CORRETAMENTE");
                return "sucesso";
            }
        } catch (Exception ex) {
            setMessagem("Erro validando login: " + ex.getMessage());
            ex.printStackTrace();
            return "falha";
        }
    }

Certamente tem alguma coisa errada aqui, talvez no faces-config mas não sei o que é, se o método que é executado no action retorna "sucesso" e o "sucesso" no navigation-rule manda carregar a página /pages/entrada.xhtml (ou entrada.jsf), não entendo porque não funciona.

javer

Ok, obrigado a todos que tiveram paciência para me ajudar nesse tópico.
Realmente era “mancada” de iniciante.
Primeiro que no faces-config tinha que ser informada a extensão .xhtml e não .jsf (mapeamento), e também tinha uma barra antes do nome da página dentro do

<navigation-rule> <from-view-id>/login.xhtml</from-view-id> <navigation-case> <from-outcome>sucesso</from-outcome> <to-view-id>/pages/entrada.xhtml</to-view-id> <redirect/> </navigation-case> <navigation-case> <from-outcome>falha</from-outcome> <to-view-id>/login.xhtml</to-view-id> </navigation-case> </navigation-rule>

Até a próxima…

fabio.massa

Boa!
ah, você pode chamar do jeito que estava fazendo anteriormente também:

&lt;navigation-rule&gt;
	&lt;navigation-case&gt;	
		&lt;from-action&gt;#{seuBean.seuMetodo}&lt;/from-action&gt;		
		&lt;from-outcome&gt;success&lt;/from-outcome&gt;
		&lt;to-view-id&gt;/suaPagina.xhtml&lt;/to-view-id&gt;			
	&lt;/navigation-case&gt;
&lt;/navigation-rule&gt;

Abraços,

Criado 5 de maio de 2009
Ultima resposta 6 de mai. de 2009
Respostas 6
Participantes 3