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

9 respostas
F

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.

9 Respostas

L

é 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

F

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.

L

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

R

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

M

Acho que no managed bean deve ser

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

Márcio

F

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.

L

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

F

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.
[email removido]

R

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="#{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.
[email removido]

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

Criado 9 de janeiro de 2008
Ultima resposta 9 de jan. de 2008
Respostas 9
Participantes 4