Action listener não é invocado no JSF

3 respostas
davidbuzatto

Pessoal, estou quase terminando um projeto, até agora não tive nenhum problema, mas estou implementando um jsp para adicionar uma linha no banco e não está funcionando. Para todas as minhas outras tabelas funcionou normal, sem problemas.

Parece que ele não enxerga o actionListener (adicionarListener) do commandButton

Olhem o código: jsp:
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<script type="text/javascript" src="${pageContext.request.contextPath}/javascript/scripts.js"></script>

<html>
    <f:view>
        <head>
            <link href="${pageContext.request.contextPath}/faces/css/styles.css" rel="stylesheet" type="text/css"/> 
            
            <f:loadBundle basename="br.edu.unifeob.spdweb.resources.mensagens" var="msgs"/>
            
            <title>
                <h:outputText value="#{msgs.tituloAplicacao}"/>
            </title>
        </head>
        <body>
            <h:form>
                <p>
                    <h:outputText value="#{msgs.tituloAdicionarPlano}" styleClass="titulo"/>
                </p>
                <h:panelGrid columns="2">
                    
                    <h:outputText value="#{msgs.labelAno}" styleClass="formLabel"/>
                    <h:selectOneMenu id="ano" 
                                     binding="#{planoBack.selectOneAno}"
                                     styleClass="formListMenu">
                        <f:selectItems value="#{listasSelecaoBack.anos}"/>
                    </h:selectOneMenu>
                    
                    <h:outputText value="#{msgs.labelDisciplina}" styleClass="formLabel"/>
                    <h:selectOneMenu id="idDisciplina" 
                                     binding="#{planoBack.selectOneIdDisciplina}"
                                     styleClass="formListMenu">
                        <f:selectItems value="#{listasSelecaoBack.disciplinas}"/>
                    </h:selectOneMenu>
                    
                    <h:outputText value="#{msgs.labelEmenta}" styleClass="formLabel"/>
                    <h:inputTextarea id="ementa" 
                                 cols="90"
                                 rows="20"
                                 binding="#{planoBack.inputEmenta}"
                                 styleClass="formInput">
                    </h:inputTextarea>
                    
                    <h:outputText value="#{msgs.labelConteudo}" styleClass="formLabel"/>
                    <h:inputTextarea id="conteudo" 
                                 cols="90"
                                 rows="20"
                                 binding="#{planoBack.inputConteudo}"
                                 styleClass="formInput">
                    </h:inputTextarea>
                    
                    <h:outputText value="#{msgs.labelCronograma}" styleClass="formLabel"/>
                    <h:inputTextarea id="cronograma" 
                                 cols="90"
                                 rows="10"
                                 binding="#{planoBack.inputCronograma}"
                                 styleClass="formInput">
                    </h:inputTextarea>
                    
                    <h:outputText value="#{msgs.labelBibliografiaBasica}" styleClass="formLabel"/>
                    <h:inputTextarea id="bibliografiaBasica" 
                                 cols="90"
                                 rows="10"
                                 binding="#{planoBack.inputBibliografiaBasica}"
                                 styleClass="formInput">
                    </h:inputTextarea>
                    
                    <h:outputText value="#{msgs.labelBibliografiaComplementar}" styleClass="formLabel"/>
                    <h:inputTextarea id="bibliografiaComplementar" 
                                 cols="90"
                                 rows="5"
                                 binding="#{planoBack.inputBibliografiaComplementar}"
                                 styleClass="formInput">
                    </h:inputTextarea>
                    
                </h:panelGrid>
                
                <p>
                    <h:commandButton value="#{msgs.labelAdicionar}"
                                     actionListener="#{planoBack.adicionarListener}"
                                     action="#{planoBack.act}"
                                     styleClass="formButton"/>
                    <h:commandButton value="#{msgs.labelCancelar}"
                                     immediate="true"
                                     actionListener="#{planoBack.cancelarListener}"
                                     action="#{planoBack.act}"
                                     styleClass="formButton"/>
                </p>
            </h:form>
        </body>
    </f:view>
</html>
Backing bean:
/**
 *
 * @author David Buzatto
 */
public class PlanoBackingBean extends GenericPersistenceBackingBean{
    
    /*
     * Componentes do formulário.
     */
    private UICommand commandAlterar;
    private UICommand commandRemover;
    private UIInput inputId;
    private UIInput inputEmenta;
    private UIInput inputConteudo;
    private UIInput inputCronograma;
    private UIInput inputBibliografiaBasica;
    private UIInput inputBibliografiaComplementar;
    private UISelectOne selectOneIdDisciplina;
    private UISelectOne selectOneAno;
    
    /*
     * Cria uma nova instância de PlanoBackingBean
     * e inicializa os componentes de formulário.
     */
    public PlanoBackingBean() {

        initComponents();

        
    }
    
    /*
     * Implementação dos métodos abstratos de GenericPersistenceBackingBean.
     */
    public void novoListener( ActionEvent event ) {
        
        // reinicia os componentes
        initComponents();
        
        // sinaliza que foi dado ok
        setAction( ActionConstants.NOVO_OK );
        
    }
    
    public void adicionarListener( ActionEvent event ) {
 
        // obtém os valores dos componentes
        int ano = Integer.parseInt( ( String ) getSelectOneAno().getValue() );
        String idDisciplina = ( String ) getSelectOneIdDisciplina().getValue();
        String ementa = ( String ) getInputEmenta().getValue();
        String conteudo = ( String ) getInputConteudo().getValue();
        String cronograma = ( String ) getInputCronograma().getValue();
        String bibliografiaBasica = ( String ) getInputBibliografiaBasica().getValue();
        String bibliografiaComplementar = ( String ) getInputBibliografiaComplementar().getValue();
        
        // cria um novo objeto com os valores dos componentes usados no binding
        Plano o = new Plano();
        o.setAno( ano );
        o.setIdDisciplina( idDisciplina );
        o.setEmenta( ementa );
        o.setConteudo( conteudo );
        o.setCronograma( cronograma );
        o.setBibliografiaBasica( bibliografiaBasica );
        o.setBibliografiaComplementar( bibliografiaComplementar );

        try{
            
            // grava o novo objeto
            new PlanoDAO< Plano >().adicionar( o );
            
            // sinaliza que foi gravado
            setAction( ActionConstants.ADICIONADO_OK );
            
            // reinicia os componentes
            initComponents();
            
        } catch ( SQLException exc ) {
            
            // sinaliza erro no sql
            setAction( ActionConstants.ERRO_SQL );
            
            // posta a excessão
            Utilidades.postSQLException( exc );
            
            // reinicia os componentes
            initComponents();
            
        }
        
    }
    
    public void alterarListener( ActionEvent event ) {
        
        // obtém os valores dos componentes
        int id = Integer.parseInt( ( String ) getInputId().getValue() );
        int ano = Integer.parseInt( (  String ) getSelectOneAno().getValue() );
        String idDisciplina = ( String ) getSelectOneIdDisciplina().getValue();
        String ementa = ( String ) getInputEmenta().getValue();
        String conteudo = ( String ) getInputConteudo().getValue();
        String cronograma = ( String ) getInputCronograma().getValue();
        String bibliografiaBasica = ( String ) getInputBibliografiaBasica().getValue();
        String bibliografiaComplementar = ( String ) getInputBibliografiaComplementar().getValue();
        
        // cria um novo objeto com os valores recebidos
        Plano o = new Plano();
        o.setAno( ano );
        o.setIdDisciplina( idDisciplina );
        o.setEmenta( ementa );
        o.setConteudo( conteudo );
        o.setCronograma( cronograma );
        o.setBibliografiaBasica( bibliografiaBasica );
        o.setBibliografiaComplementar( bibliografiaComplementar );
        
        try{
            
            // altera o objeto obtido
            new PlanoDAO< Plano >().alterar( o );
            
            // sinaliza que foi alterado
            setAction( ActionConstants.ALTERADO_OK );
            
            // reinicia os componentes
            initComponents();
            
        } catch ( SQLException exc ) {
            
            // sinaliza erro no sql
            setAction( ActionConstants.ERRO_SQL );
            
            // posta a excessão
            Utilidades.postSQLException( exc );
            
            // reinicia os componentes
            initComponents();
            
        }
        
    }
    
    public void removerListener( ActionEvent event ) {
        
        // obtém o valor do id pelo componente command
        int id = Integer.parseInt( ( String ) getInputId().getValue() );
        
        // cria um novo objeto com o id recebido
        Plano o = new Plano();
        o.setId( id );
        
        try{
            
            // remove o objeto
            new PlanoDAO< Plano >().remover( o );
            
            // sinaliza que foi removido
            setAction( ActionConstants.REMOVIDO_OK );
            
            // reinicia os componentes
            initComponents();
            
        } catch ( SQLException exc ) {
            
            // sinaliza erro no sql
            setAction( ActionConstants.ERRO_SQL );
            
            // posta a excessão
            Utilidades.postSQLException( exc );
            
            // reinicia os componentes
            initComponents();
            
        }
        
    }
    
    public void prepararAlteracaoListener( ActionEvent event ) {
        
        // obtém o valor do id pelo componente command
        int id = ( Integer ) getCommandAlterar().getValue();
        
        try{
            
            // cria um novo dao
            PlanoDAO dao = new PlanoDAO();
            
            // obtém o valor correto
            Plano o = ( Plano ) dao.getById( id ).get( 0 );
            
            // seta os valores nos componentes
            getInputId().setValue( o.getId() );
            getSelectOneAno().setValue( o.getAno() );
            getSelectOneIdDisciplina().setValue( o.getIdDisciplina() );
            getInputEmenta().setValue( o.getEmenta() );
            getInputConteudo().setValue( o.getConteudo() );
            getInputCronograma().setValue( o.getCronograma() );
            getInputBibliografiaBasica().setValue( o.getBibliografiaBasica() );
            getInputBibliografiaComplementar().setValue( o.getBibliografiaComplementar() );
            
            // sinaliza que está pronto para alterar
            setAction( ActionConstants.PREPARADO_ALTERACAO_OK );
            
        } catch ( SQLException exc ) {
            
            // sinaliza erro no sql
            setAction( ActionConstants.ERRO_SQL );
            
            // posta a excessão
            Utilidades.postSQLException( exc );
            
        }
        
    }
    
    public void prepararRemocaoListener( ActionEvent event ) {
        
        // obtém o valor do id pelo componente command
        int id = ( Integer ) getCommandAlterar().getValue();
        
        try{
            
            // cria um novo dao
            PlanoDAO dao = new PlanoDAO();
            
            // obtém o valor correto
            Plano o = ( Plano ) dao.getById( id ).get( 0 );
            
            // seta os valores nos componentes
            getInputId().setValue( o.getId() );
            getSelectOneAno().setValue( o.getAno() );
            getSelectOneIdDisciplina().setValue( o.getIdDisciplina() );
            getInputEmenta().setValue( o.getEmenta() );
            getInputConteudo().setValue( o.getConteudo() );
            getInputCronograma().setValue( o.getCronograma() );
            getInputBibliografiaBasica().setValue( o.getBibliografiaBasica() );
            getInputBibliografiaComplementar().setValue( o.getBibliografiaComplementar() );
            
            // sinaliza que está pronto para remover
            setAction( ActionConstants.PREPARADO_REMOCAO_OK );
            
        } catch ( SQLException exc ) {
            
            // sinaliza erro no sql
            setAction( ActionConstants.ERRO_SQL );
            
            // posta a excessão
            Utilidades.postSQLException( exc );
            
        }
        
    }
    
    public void cancelarListener( ActionEvent event ) {
        
        // reinicia os componentes
        initComponents();
        
        // sinaliza que foi cancelado
        setAction( ActionConstants.CANCELADO_OK );
        
    }
    
    public List getList() {
        
        try{
            
            return new PlanoDAO().getList();
            
        } catch ( SQLException exc ) {
            
            // posta a excessão
            Utilidades.postSQLException( exc );
            
            return null;
            
        }
        
    }
    
    public Result getListaApresentacao() {
        
        try {
            
            Connection conexao = ConnectionFactory.getConnection(
                    ConnectionConstants.SPD_WEB );
            
            PreparedStatement stmt = conexao.prepareStatement(
                    "SELECT p.id id, p.ano ano, c.descricao descCurso, d.descricao descDisciplina, p.status status " +
                    "    FROM plano p, disciplina d, curso c " +
                    "    WHERE p.id_disciplina = d.id AND " +
                    "        d.id_curso = c.id " +
                    "    ORDER BY ano, descCurso, descDisciplina ");
            
            ResultSet rs = stmt.executeQuery();
            
            return ResultSupport.toResult( rs );
            
        } catch ( SQLException exc ) {
            
            // posta a excessão
            Utilidades.postSQLException( exc );
            
            return null;
            
        }
        
    }
    
    public String act() {
        return getAction();
    }
    
    /*
     * Inicializa os componentes de binding com o formulário.
     */
    private void initComponents() {

        setCommandAlterar( new UICommand() );
        setCommandRemover( new UICommand() );
        setInputId( new UIInput() );
        setSelectOneAno( new UISelectOne() );
        setInputEmenta( new UIInput() );
        setInputConteudo( new UIInput() );
        setInputCronograma( new UIInput() );
        setInputBibliografiaBasica( new UIInput() );
        setInputBibliografiaComplementar( new UIInput() );
        setSelectOneIdDisciplina( new UISelectOne() );
        
    }

    public UICommand getCommandAlterar() {
        return commandAlterar;
    }

    public void setCommandAlterar(UICommand commandAlterar) {
        this.commandAlterar = commandAlterar;
    }

    public UICommand getCommandRemover() {
        return commandRemover;
    }

    public void setCommandRemover(UICommand commandRemover) {
        this.commandRemover = commandRemover;
    }

    public UIInput getInputId() {
        return inputId;
    }

    public void setInputId(UIInput inputId) {
        this.inputId = inputId;
    }

    public UIInput getInputEmenta() {
        return inputEmenta;
    }

    public void setInputEmenta(UIInput inputEmenta) {
        this.inputEmenta = inputEmenta;
    }

    public UIInput getInputConteudo() {
        return inputConteudo;
    }

    public void setInputConteudo(UIInput inputConteudo) {
        this.inputConteudo = inputConteudo;
    }

    public UIInput getInputCronograma() {
        return inputCronograma;
    }

    public void setInputCronograma(UIInput inputCronograma) {
        this.inputCronograma = inputCronograma;
    }

    public UIInput getInputBibliografiaBasica() {
        return inputBibliografiaBasica;
    }

    public void setInputBibliografiaBasica(UIInput inputBibliografiaBasica) {
        this.inputBibliografiaBasica = inputBibliografiaBasica;
    }

    public UIInput getInputBibliografiaComplementar() {
        return inputBibliografiaComplementar;
    }

    public void setInputBibliografiaComplementar(UIInput inputBibliografiaComplementar) {
        this.inputBibliografiaComplementar = inputBibliografiaComplementar;
    }

    public UISelectOne getSelectOneIdDisciplina() {
        return selectOneIdDisciplina;
    }

    public void setSelectOneIdDisciplina(UISelectOne selectOneIdDisciplina) {
        this.selectOneIdDisciplina = selectOneIdDisciplina;
    }

    public UISelectOne getSelectOneAno() {
        return selectOneAno;
    }

    public void setSelectOneAno(UISelectOne selectOneAno) {
        this.selectOneAno = selectOneAno;
    }
    
}

Esse bean e os outros utilizados no jsp acima estão devidamente configurados no faces-config.

Já fiz isso váááááárias vezes, mas só com o último cadastro está dando pau.

Aguardo resposta!

3 Respostas

D

Vc deve está com problemas na validação, tente declarar a tag <h:messages/>, a mesma exibirá possiveis erros de conversão na tela(Deve ser o seu caso!!!). Este procedimento é executada antes da chamada do actionListener. Por isso o mesmo não é executado!!!

davidbuzatto

dders, muito obrigado!

Era isso mesmo.

O método que criava os valores do combo de anos usava um Integer no value do SelectItem

Quando submeti apareceu: Validation Error: Invalid Value… Fui no método adicionei o conteudo como string e deu certo.

Muito obrigado :smiley:

D

É isso ae cara, bola pra frente!!! Qualquer dúvida estamos ae!!!

Criado 1 de fevereiro de 2007
Ultima resposta 1 de fev. de 2007
Respostas 3
Participantes 2