[JSF] Action do h:commandButton (Básica)

Pessoal;
Bom Dia!

Tinha no action do meu h:commandButton a string “loginSup” e estava funcionando perfeitamente. Resolvi criar uma propriedade em meu Bean para eu poder controlar o tipo de login. Agora o meu action não está funcionando. Poderiam me ajudar? Segue como estou fazendo agora:

h:commandButton:

<h:commandButton value="Consultar" action="#{Usuario.usuSup}"/>

Meu faces-config:

...
    <navigation-case>
        <from-outcome>loginSup</from-outcome>
        <to-view-id>/consMetaSup.jsp</to-view-id>
    </navigation-case>
    <navigation-case>
        <from-outcome>loginRep</from-outcome>
        <to-view-id>/consMeta.jsp</to-view-id>
    </navigation-case>
    </navigation-rule>    
    </navigation-case>

O interessante é que, para testar se o bean estava com o valor, coloquei a sintaxe na pagina JSF:

<h:outputText value="#{Usuario.usuSup}"/>

Por incrível que pareça o conteúdo está correto: loginSup
Deveria portanto me direcionar para a página consMetaSup.jsp, correto?

Mas está dando a seguinte mensagem de erro:

javax.servlet.ServletException: #{Usuario.usuSup}: javax.faces.el.MethodNotFoundException: usuSup: com.krill.bean.Usuario.usuSup()
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:209)

Poderiam me auxiliar? Estou aprendendo ainda, comecei a estudar JSF há algumas semanas apenas!

Desde já agradeço a atenção;

Marco Aurélio.

é que assim

quando um action é chamado no backing bean, a função tem que exatamente como está no action, por exemplo:

<h:commandButton action="#{meuBean.meuAction}" />

e no backing bean

public String meuAction() { return "success"; }

agora quando é propriedade, ele segue a nomenclatura dos java beans

<h:inputText value="#{meuBean.meuAction}" />

teria que ter um acesso assim

public String getMeuAction() { return meuAction; }

Pelo que ví o problema é com isso, ou seja, você provavelmente trocou alguma assinatura de um método ou algo do gênero. Verifique se eles seguem os padrões e estão sendo utilizando corretamente

Olá Leozin

Obrigado pela ajuda. Testei como você me disse mas ainda o erro persiste. Creio que eu não tenha entendido direito:

O meu bean estava assim:

    public java.lang.String getUsuSup() {
        return this.usuSup;
    }

Estava setando ele com as strings “loginSup” ou “loginRep” através de uma outra classe:

...
                   while (rs.next()){
                        usuCod=(rs.getString(1)); 
                        usuNome=(rs.getString(2));
                        usuLista=(rs.getString(3));
                        if ((rs.getString(4)).equals("S")) usuSup="loginSup"; 
                            else usuSup="loginRep";
                        loginOk="loginOK";        
	     }
...

Aí eu alterei o bean conforme você me disse (se é que entendi):

    public java.lang.String getUsuSup() {
        if (this.usuSup=="S") return "loginSup";
        else return "loginRep";
    }

A classe que sá o setUsuSup está enviando “S” ou “N” apenas. Mas mesmo assim o erro continua. No <h:outputText> o bean é mostrado certinho com o “loginSup” o problema é que não estou conseguindo passar esta String no action do botão.

Mais uma vez agradeço e aguardo auxílio!

Marco A.

deixa eu ver se eu entendi

depois de executar um result set específico e, de acordo com uma regrinha alí, ele vai te direcionar para uma página X ou página Y né?

posta o código do teu backing bean e do form da tua página que chama o teu backing bean

abraço

fanama, esse erro ocorre pois voce chama o action assim: #{Usuario.usuSup} .

Pelo que vi, ele tem esse nome getUsuSup() né? No action voce deve colocar #{Usuario.getUsuSup} …

Foi como leo disse, epero que tenha entendido.

Att,

Renan

Acho que no managed bean deve ser

public String usuSup(){ return "usuSup"; }

Márcio

Olá amigos!

Agradeço de antemão a ajuda e paciência comigo!

Vamos lá, estou usando o NetBeans 5.5, quando na página digito o ponto do “#{Usuario.usuSup}” o Netbeans já me mostra o bean.

Caso eu coloque qualquer outro nome o tomcat me retorna o erro:

org.apache.jasper.JasperException: javax.servlet.ServletException: javax.servlet.jsp.JspException: javax.faces.el.PropertyNotFoundException: Error getting property 'getUsuSup' from bean of type com.krill.bean.Usuario

Esse erro ocorre já na página index.jsp, o código que chamo o bean é na página welcomeLogin.jsp abaixo:

<P ><FONT face="Arial Black" color=#a8986e size=4>Ol&aacute;&lt;h:outputText value="#{Usuario.usuSup}"/&gt;</FONT></P>
<P >&nbsp;</P>
&lt;div align="center"&gt;&lt;/div&gt;                                                                
&lt;table width="300" border="0" align="center" cellpadding="0" cellspacing="0"&gt;
&lt;tr&gt;
&lt;td width="22%"&gt;&lt;span class="style8"&gt;M&ecirc;s (MM):&lt;/span&gt;&lt;/td&gt;
&lt;td width="25%"&gt;&lt;h:inputText size="4" maxlength="2" id="mes" value="#{Usuario.mes}"/&gt;&lt;/td&gt;
&lt;td width="22%"&gt;&lt;span class="style8"&gt;Ano (aaaa):&lt;/span&gt;&lt;/td&gt;
&lt;td width="31%"&gt;&lt;h:inputText size="6" maxlength="4" id="ano" value="#{Usuario.ano}"/&gt;&lt;/td&gt;
&lt;/tr&gt;

Observem que logo na primeira linha eu uso o bean em um outputtext e o conteúdo deste é o “loginSup”, estou usando a mesma nomenclatura do bean para o CommandButton.

Segue meu bean:

/*
 * Usuario.java
 *
 * Created on 7 de Janeiro de 2008, 13:45
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.krill.bean;
import com.krill.dao.DAO;

/**
 *
 * @author administrador
 */
public class Usuario {

    /** Creates a new instance of Usuario */
    public Usuario() {
    }

    /**
     * Mantém o valor da propriedade usuLogin.
     */
    private String usuLogin;

    /**
     * "Getter" para a propriedade usuLogin.
     * @return Valor para a propriedade usuLogin.
     */
    public String getUsuLogin() {
        return this.usuLogin;
    }

    /**
     * "Setter" para a propriedade usuLogin.
     * @param usuLogin Novo valor para a propriedade usuLogin.
     */
    public void setUsuLogin(String usuLogin) {
        this.usuLogin = usuLogin;
    }

    /**
     * Mantém o valor da propriedade usuSenha.
     */
    private String usuSenha;

    /**
     * "Getter" para a propriedade usuSenha.
     * @return Valor para a propriedade usuSenha.
     */
    public String getUsuSenha() {
        return this.usuSenha;
    }

    /**
     * "Setter" para a propriedade usuSenha.
     * @param usuSenha Novo valor para a propriedade usuSenha.
     */
    public void setUsuSenha(String usuSenha) {
        this.usuSenha = usuSenha;
    }

    /**
     * Mantém o valor da propriedade usuNome.
     */
    private String usuNome;

    /**
     * "Getter" para a propriedade usuNome.
     * @return Valor para a propriedade usuNome.
     */
    public String getUsuNome() {
        return this.usuNome;
    }

    /**
     * "Setter" para a propriedade usuNome.
     * @param usuNome Novo valor para a propriedade usuNome.
     */
    public void setUsuNome(String usuNome) {
        this.usuNome = usuNome;
    }
   
    /**
     * Mantém o valor da propriedade mes.
     */
    private String mes;

    /**
     * "Getter" para a propriedade mes.
     * @return Valor para a propriedade mes.
     */
    public String getMes() {
        return this.mes;
    }

    /**
     * "Setter" para a propriedade mes.
     * @param mes Novo valor para a propriedade mes.
     */
    public void setMes(String mes) {
        this.mes = mes;
    }

    /**
     * Mantém o valor da propriedade ano.
     */
    private String ano;

    /**
     * "Getter" para a propriedade ano.
     * @return Valor para a propriedade ano.
     */
    public String getAno() {
        return this.ano;
    }

    /**
     * "Setter" para a propriedade ano.
     * @param ano Novo valor para a propriedade ano.
     */
    public void setAno(String ano) {
        this.ano = ano;
    }

    /**
     * Mantém o valor da propriedade listaVendedores.
     */
    private String usuLista;

    /**
     * "Getter" para a propriedade listaVendedores.
     * @return Valor para a propriedade listaVendedores.
     */
    public String getUsuLista() {
        return this.usuLista;
    }

    /**
     * "Setter" para a propriedade listaVendedores.
     * @param listaVendedores Novo valor para a propriedade listaVendedores.
     */
    public void setUsuLista(String usuLista) {
        this.usuLista = usuLista;
    }

    /**
     * Mantém o valor da propriedade usuCod.
     */
    private String usuCod;

    /**
     * "Getter" para a propriedade usuCod.
     * @return Valor para a propriedade usuCod.
     */
    public String getUsuCod() {
        return this.usuCod;
    }

    /**
     * "Setter" para a propriedade usuCod.
     * @param usuCod Novo valor para a propriedade usuCod.
     */
    public void setUsuCod(String usuCod) {
        this.usuCod = usuCod;
    }
  
    /**
     * Mantém o valor da propriedade usuSup.
     */
    private String usuSup;

    /**
     * "Getter" para a propriedade usuSup.
     * @return Valor para a propriedade usuSup.
     */
    public String getUsuSup() {
        return this.usuSup;
    }

    /**
     * "Setter" para a propriedade usuSup.
     * @param usuSup Novo valor para a propriedade usuSup.
     */
    public void setUsuSup(String usuSup) {
        this.usuSup = usuSup;
    }

 public String verificaLogin(){
        DAO verifica = new DAO();
        verifica.VerUsuario(this.usuLogin, this.usuSenha);
        this.setUsuLogin(verifica.usuNome);
        this.setUsuCod(verifica.usuCod);
        this.setUsuLista(verifica.usuLista);
        this.setUsuSup(verifica.usuSup);
        return verifica.loginOk;
    }

   public MetaVend[] getConsMetaVend() throws ClassNotFoundException {
        DAO consulta=new DAO();
        return consulta.getListaMetaVend(this.getUsuLista(), this.getMes(), this.getAno());
   }

   public Produto[] getConsProduto() throws ClassNotFoundException {
        DAO consulta=new DAO();
        return consulta.getListaProduto();
   }

}

Mais uma vez agradeço;

Marco A.

então a excessão está acontecendo no commandButton e não no inputText?

Olá Leozin

Era isso mesmo, ó erro só estava dando no H:commandbutton, o h:outputtext estava ok. Acabei de, não sei como, conseguir (14h22).

Acabei fuçando em tudo e deu certo! Não sei o que fiz mas insisti em colocar o nome do bean completo no h:command button como vcs me indicaram. Tinha tentado numa outra vez e havia dado o erro que postei, sei lá!

olha como ficou:

h:outputtext:

&lt;h:outputText value="#{Usuario.usuSup}"/&gt;

e o h:commandbutton:

&lt;h:commandButton value="Consultar" action="#{Usuario.getUsuSup}"/&gt;

Sou muitíssimo grato à você e aos demais colegas que me auxiliaram. Que Deus lhes abençoe e continue dando sabedoria para prosperidade nos negócios!

Abração!

Marco A.
fanama@itelefonica.com.br

[quote=fanama]Olá Leozin

Era isso mesmo, ó erro só estava dando no H:commandbutton, o h:outputtext estava ok. Acabei de, não sei como, conseguir (14h22).

Acabei fuçando em tudo e deu certo! Não sei o que fiz mas insisti em colocar o nome do bean completo no h:command button como vcs me indicaram. Tinha tentado numa outra vez e havia dado o erro que postei, sei lá!

olha como ficou:

h:outputtext:

&lt;h:outputText value=&quot;#{Usuario.usuSup}&quot;/&gt;

e o h:commandbutton:

&lt;h:commandButton value=&quot;Consultar&quot; action=&quot;#{Usuario.getUsuSup}&quot;/&gt;

Sou muitíssimo grato à você e aos demais colegas que me auxiliaram. Que Deus lhes abençoe e continue dando sabedoria para prosperidade nos negócios!

Abração!

Marco A.
fanama@itelefonica.com.br
[/quote]

Foi exatamento o que disse para voce fazer. Assim como o leo tinha explicado.

Nos actions use o nome do metodo inteiro!
Em caso de get e set de atributo , use a regra do jsf -> #{Usuario.UsuSup} , sem o get ou set. ( O jsf te permite referenciar diretamente ao atributo(para facilitar seu trabalho) como se(finjindo) estivesse acessando seu valor diretamente, ao inves de atraves dos metodos get e set (que sao publicos, ao contrario dos atributos) )

Um conselho meu: Se seu metodo tiver algum retorno string que será usado para regras de navegacao do seu projeto, nao use a palavra get ou set antes. Foi isso que gerou confusao.

Mas melhor ainda,

Eu crio minhas classes com atributos e seus respectivos gets e sets …
E os outros metodos, que retornam strings para definir navegacao das paginas, eu uso uma classe especifica (o controller da classe acima !!!)

Exemplo:
No seu caso, existe a classe Usuarios.java com os metodos gets e sets. Eu criaria uma classe UsuariosController.java(com um atributo do tipo Usuario) com metodos que retornam strings para navegacao das minhas paginas. Com isso, no meu jsp teria apenas referencia ao controler, assim: #{UsuariosController.usuario.atributo)}

Padroes de projeto -> MVC . Eu aconselho o estudo, vale a pena :slight_smile:

Att,

Renan