Action do h:commandButton não executa

Olá pessoal!

O action do h:commandButton não está executando. Estou usando JSF 2.2 puro. O escopo do bean é Request. Alguém poderia me ajudar a corrigir esse problema?

Botão:
<h:commandButton class="btn btn-success" value="Salvar" action="#{clienteBean.salvar()}" onclick="return confirm('Confirma a gravação dos dados?')"/>

Bean:
public void salvar() { this.cliente.setStatus("Ativo"); ClienteRN clienteRN = new ClienteRN(); clienteRN.salvar(this.cliente); limpar(); }

Obrigada desde já.

Puxa gente, será que não tem ninguém que possa me ajudar com isso? Tô quebrando a cabeça pra fazer funcionar há dias e não consigo.

Aqui está o código da página que contém o botão:
`<?xml version="1.0" encoding="UTF-8"?>

<h:head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Cadastro de Cliente</title>
    
    <h:outputStylesheet library="css" name="bootstrap.css" />
    <h:outputStylesheet library="css" name="bootstrap-datepicker.css" />
    
    <h:outputScript library="js" name="jquery.min.js" />
    <h:outputScript library="js" name="bootstrap.js" />
    <h:outputScript library="js" name="bootstrap-datepicker.js" />
    <h:outputScript library="js" name="maskedinput.js" />
    
    <script>
        $(document).ready(function () {
    	$('.datepicker').datepicker({
        	format: 'dd/mm/yyyy',                
            language: 'pt-BR'
            });
        });
</script>
    
    <script>
    $(document).ready(function($) {
   		$("#date").mask("99/99/9999");
        });
</script>
</h:head>

<h:body>
	<!-- Início "Principal" -->
<div id="principal" class="container-fluid">
        <!-- Início "Topo" --> 
        <div id="topo" class="row">
        	<div class="col-md-12">
                <ui:include src="/template/menu_sistema.xhtml"/> 
            </div>
        </div>
        <!-- Fim "Topo" -->
        
        <!-- Início "Cabeçalho" -->
        <div id="cabecalho" class="row">
	<div class="col-md-12">
                <h2>Cadastro de Clientes</h2>
		</div>
        </div>
        <!-- Fim "Cabeçalho" -->
            
        <!-- Menu de Botões -->                
        <div id="menu_botoes" class="row">
          	<div class="col-md-12">    
                <div class="btn-toolbar" role="toolbar"> 
  		<h:form class="btn-group pull-left" role="group" id="btn-group-left">
                        <h:button class="btn btn-primary" outcome="cadastro_cliente.jsf" value="Novo"/>
                        <h:commandButton class="btn btn-success" value="Salvar" action="#{clienteBean.salvar()}"/>  
  			</h:form>
  			<div class="btn-group pull-right" role="group" id="btn-group-right">
                        <h:button class="btn btn-warning" value="Anexos" outcome="cadastro_arquivo.jsf"/>       
                        <h:button class="btn btn-info" value="Pesquisar" outcome="consulta_clientes.jsf"/>
  			</div>
                </div>
            </div>    
        </div>    
        <!-- Fim Menu de Bot�es -->
                
        <!-- Formulário -->
        <div id="formulario" class="row">
        	<div class="col-md-12">
                <h:form id="form" prependId="false" class="form-horizontal" acceptcharset="ISO-8859-1">
                    <h:inputHidden id="codigo" value="#{clienteBean.cliente.codigo}"/>
            	<div class="form-group"> <!-- Primeira Linha -->
                        <label class="control-label col-md-2" for="corretor">Corretor Responsável:</label>
                        <div class="col-md-5">
                            <h:selectOneMenu class="form-control" id="corretor" value="#{clienteBean.cliente.corretor}" required="true"
                                             requiredMessage="Campo 'Corretor' é obrigatório!" converter="corretorConverter">
                                <f:selectItem itemLabel="Selecione" />
                                <f:selectItems value="#{clienteBean.corretores}" var="corretor" itemLabel="#{corretor.nome}" itemValue="#{corretor}" />
               		</h:selectOneMenu>
                            <h:message for="corretor" errorStyle="color:darkred;font-size:11px;"/>
                        </div>
                        <label class="control-label col-md-2" for="data_cadastro">Data Cadastro:</label>
                        <h:outputLabel class="control-label col-md-1" value="#{clienteBean.cliente.datacadastro}">
                            <f:convertDateTime pattern="dd/MM/yyyy" />
                        </h:outputLabel>    
            	</div> <!-- Fim Primeira Linha -->
          		<div class="form-group"> <!-- Segunda Linha -->
                        <label class="control-label col-md-2" for="nome">Nome:</label>
                        <div class="col-md-5">
                            <h:inputText class="form-control" id="nome" value="#{clienteBean.cliente.nome}" required="true" requiredMessage="Campo 'Nome' é obrigatório!"/>
                            <h:message for="nome" errorStyle="color:darkred;font-size:11px;"/>
                        </div>
                        <label class="control-label col-md-2" for="data_nascimento">Data Nascimento:</label>
                        <h:inputText class="datepicker col-md-1" id="data_nascimento" value="#{clienteBean.cliente.nascimento}"/>
            	</div> <!-- Fim Segunda Linha -->   
            	<div class="form-group"> <!-- Terceira Linha -->
                        <label class="control-label col-md-2" for="pessoa">Pessoa:</label>
                        <div class="col-md-2">
               		<h:selectOneMenu class="form-control" id="pessoa" value="#{clienteBean.cliente.tipopessoa}">
                                <f:selectItem itemLabel="Física" itemValue="Física" />
                                <f:selectItem itemLabel="Jurídica" itemValue="Jurídica" />
               		</h:selectOneMenu>
                        </div>
                        <label class="control-label col-md-5" for="cpf">CPF / CNPJ:</label>
                        <h:inputText class="col-md-2" value="#{clienteBean.cliente.cpf_cnpj}" onkeyup="mascara(this, cpfcnpj)"/> 
            	</div> <!-- Fim Terceira Linha --> 
            	<div class="form-group"> <!-- Quarta Linha -->
                        <label class="control-label col-md-2" for="sexo">Sexo:</label>
                        <div class="col-md-2">
                            <h:selectOneMenu class="form-control" id="sexo" value="#{clienteBean.cliente.sexo}">
                                <f:selectItem itemLabel="Selecione"/>
                                <f:selectItem itemLabel="Masculino" itemValue="Masculino" />
                                <f:selectItem itemLabel="Feminino" itemValue="Feminino" />
               		</h:selectOneMenu>
                        </div>
                        <label class="control-label col-md-5" for="estado_civil">Estado Civil:</label>
                        <div class="col-md-2">
                            <h:selectOneMenu id="estado_civil" class="form-control" value="#{clienteBean.cliente.estadocivil}">
                                <f:selectItem itemLabel="Selecione"/>
                                <f:selectItem itemLabel="Casado(a)" itemValue="Casado(a)"/>
                                <f:selectItem itemLabel="Divorciado(a)" itemValue="Divorciado(a)"/>
                                <f:selectItem itemLabel="Separado(a)" itemValue="Separado(a)"/>
                                <f:selectItem itemLabel="Solteiro(a)" itemValue="Solteiro(a)"/>
                                <f:selectItem itemLabel="Viúvo(a)" itemValue="Viúvo(a)"/>
               		</h:selectOneMenu>
                        </div>  
            	</div> <!-- Fim Quarta Linha --> 
               	<div class="form-group"> <!-- Quinta Linha -->
                        <label class="control-label col-md-2" for="tipo_doc">Tipo Documento:</label>
                        <div class="col-md-2">
               		<h:selectOneMenu id="tipodoc" class="form-control" value="#{clienteBean.cliente.tipodoc}">
                                <f:selectItem itemLabel="Selecione"/>
                                <f:selectItem itemLabel="RG" itemValue="RG" />
                                <f:selectItem itemLabel="RNE" itemValue="RNE" />
                                <f:selectItem itemLabel="DOCTO DE CLASSE" itemValue="DOCTO DE CLASSE" />
                            </h:selectOneMenu>
                        </div>
                        <label class="control-label col-md-5" for="numdoc">Nº Documento:</label>
                        <h:inputText id="numdoc" class="col-md-2" value="#{clienteBean.cliente.numdoc}" onkeyup="mascara(this, soNumeros)"/>  
            	</div> <!-- Fim Quinta Linha --> 
               	<div class="form-group"> <!-- Sexta Linha -->
                        <label class="control-label col-md-2" for="orgao_emissor">Órgão Emissor:</label>
                        <div class="col-md-2">
                            <h:inputText id="orgao_emissor" class="form-control" value="#{clienteBean.cliente.orgaodoc}"
                                         onkeydown="this.value = this.value.toUpperCase();" onkeyup="this.value = this.value.toUpperCase()"/>
                        </div>
                        <label class="control-label col-md-5" for="data_emissao">Emissão / Validade:</label>
                        <h:inputText id="data_emissao" class="datepicker col-md-1" value="#{clienteBean.cliente.datadoc}"/>  
            	</div> <!-- Fim Sexta Linha --> 
               	<div class="form-group"> <!-- S�tima Linha -->
                        <label class="control-label col-md-2" for="cnh">CNH:</label>
                        <div class="col-md-2">
               		<h:inputText id="cnh" class="form-control" value="#{clienteBean.cliente.numcnh}"/>
                        </div>
                        <label class="control-label col-md-5" for="data_cnh">Validade CNH:</label>
                        <h:inputText id="validade_cnh" class="datepicker col-md-1" value="#{clienteBean.cliente.validadecnh}"/>  
            	</div> <!-- Fim S�tima Linha --> 
                    <div class="form-group"> <!-- Oitava Linha -->
                        <label class="control-label col-md-2" for="categoria_cnh">Categoria CNH:</label>
                        <div class="col-md-1">
               		<h:inputText id="categoria_cnh" class="form-control" value="#{clienteBean.cliente.categoriacnh}"
                                         onkeydown="this.value = this.value.toUpperCase();" onkeyup="this.value = this.value.toUpperCase()"/>
                        </div>
                        <label class="control-label col-md-6" for="data_cnh">Primeira Habilitação:</label>
                        <h:inputText id="primeira_habilitacao" class="datepicker col-md-1" value="#{clienteBean.cliente.primeiracnh}"/>  
            	</div> <!-- Fim Oitava Linha --> 
                    <div class="form-group"> <!-- Nona Linha -->
                        <label class="control-label col-md-2" for="profissao">Profissão:</label>
                        <div class="col-md-3">
                            <h:selectOneMenu id="profissoes" class="form-control" value="#{clienteBean.cliente.profissao}" converter="profissaoConverter" immediate="true">                          
                                <f:selectItem itemLabel="Selecione" />
                                <f:selectItems value="#{clienteBean.profissoes}" var="profissao" itemValue="#{profissao}" itemLabel="#{profissao.descricao}"/>
                            </h:selectOneMenu>
                        </div>
                        <label class="control-label col-md-4" for="status">Status:</label>
                        <h:outputLabel class="control-label col-md-1" value="#{clienteBean.cliente.status}"/>
                   	</div> <!-- Fim Nona Linha -->     
                </h:form>
            </div>     
         </div> 
         <!-- Fim Formulário -->     
                
         <!-- Tabela de Navegação -->    
         <div id="tabela_navegacao" class="row">
         	<div class="col-md-12">
                <ul class="nav nav-tabs">
		<li class="active"><a data-toggle="tab" href="#endereco">Endereço</a></li>
		<li><a data-toggle="tab" href="#contato">Contato</a></li>
                </ul>  
                    
                <div class="tab-content">
		<div id="endereco" class="tab-pane fade in active">
                        <div class="form-horizontal">
                       	<div class="form-group"> <!-- Primeira Linha -->
                                <label class="control-label col-md-2" for="logradouro">Logradouro:</label>
                                <div class="col-md-5">
                                    <h:inputText id="logradouro" class="form-control" maxlength="200" value="#{clienteBean.cliente.logradouro}"/>
                                </div>
                                <label class="control-label col-md-2" for="numero">Número:</label>
                                <div class="col-md-1">
                                    <h:inputText id="numero" class="form-control" maxlength="10" value="#{clienteBean.cliente.numero}" onkeyup="mascara(this, soNumeros)"/>
                                </div>
            		</div> <!-- Fim Primeira Linha -->
                            <div class="form-group"> <!-- Segunda Linha -->
                                <label class="control-label col-md-2" for="complemento">Complemento:</label>
                                <div class="col-md-2">
               			<h:inputText id="complemento" class="form-control" value="#{clienteBean.cliente.complemento}"/>
                                </div>
                                <label class="control-label col-md-5" for="numero">Bairro:</label>
                                <div class="col-md-2">
                                    <h:inputText id="bairro" class="form-control" maxlength="150" value="#{clienteBean.cliente.bairro}"/>
                                </div>
            		</div> <!-- Fim Segunda Linha -->
                            <div class="form-group"> <!-- Terceira Linha -->
                                <label class="control-label col-md-2" for="cidade">Cidade:</label>
                                <div class="col-md-3">
                                    <h:inputText id="cidade" class="form-control" maxlength="150" value="#{clienteBean.cliente.cidade}"/>
                                </div>
                                <label class="control-label col-md-4" for="estado">Estado:</label>
                                <div class="col-md-2">
               			<h:selectOneMenu id="estado" class="form-control" value="#{clienteBean.cliente.uf}" >
                                        <f:selectItem itemLabel="Selecione" />
                                        <f:selectItems value="#{clienteBean.estados}" var="estado" itemLabel="#{estado.descricao}" itemValue="#{estado}"/>
                                    </h:selectOneMenu>
                                </div>
            		</div> <!-- Fim Terceira Linha -->
                            <div class="form-group"> <!-- Quarta Linha -->
                                <label class="control-label col-md-2" for="cep">CEP:</label>
                                <div class="col-md-1">
                                    <h:inputText id="cep" class="form-control" value="#{clienteBean.cliente.cep}" onkeyup="mascara(this, cep)"/>
                                </div> 
            		</div> <!-- Fim Quarta Linha -->
                        </div>    
			</div>
		<div id="contato" class="tab-pane fade">
                        <div class="form-horizontal">
                       	<div class="form-group"> <!-- Primeira Linha -->
                                <label class="control-label col-md-2" for="email">E-mail:</label>
                                <div class="col-md-5">
                                    <h:inputText id="email" class="form-control" value="#{clienteBean.cliente.email}"/>
                                </div>
                                <label class="control-label col-md-2" for="celular">Celular:</label>
                                <div class="col-md-2">
                                    <h:inputText id="celular" class="form-control" value="#{clienteBean.cliente.celular}" onkeyup="mascara(this, celular)"/>
                                </div>
            		</div> <!-- Fim Primeira Linha -->
                            <div class="form-group"> <!-- Segunda Linha -->
                                <label class="control-label col-md-2" for="telefone">Telefone Fixo:</label>
                                <div class="col-md-2">
                                    <h:inputText id="telefone" class="form-control" value="#{clienteBean.cliente.telefone}" onkeyup="mascara(this, telefone)"/>
                                </div>
                                <label class="control-label col-md-5" for="telefone_comercial">Telefone Comercial:</label>
                                <div class="col-md-2">
                                    <h:inputText id="telefone_comercial" class="form-control" value="#{clienteBean.cliente.telefonecomercial}" onkeyup="mascara(this, telefone)"/>
                                </div>
            		</div> <!-- Fim Segunda Linha -->
                            <div class="form-group"> <!-- Terceira Linha -->
                                <label class="control-label col-md-2" for="cidade">Telefone Recado:</label>
                                <div class="col-md-2">
                                    <h:inputText id="telefone_recado" class="form-control" value="#{clienteBean.cliente.telefonerecado}" onkeyup="mascara(this, telefone)"/>
                                </div>
            		</div> <!-- Fim Terceira Linha -->
                        </div>     
		</div>
                </div>   
            </div>
        </div>
        <!-- Fim Tabela de Navegaçãoo -->
</div>    
    <!-- Fim "Principal" -->
</h:body>
`

Obrigada.

Olá sgrandini.

Observei seu código e em relação ao front aparentemente está tudo certo. Pode nos mostrar o código completo do seu bean e se possível do faces-config.xml também?

Olá felipesntsassis!

Segue código:

ClienteBean:
`package br.com.corretora.cliente;
import br.com.corretora.enumeracao.Uf;
import br.com.corretora.enumeracao.TipoPessoa;
import br.com.corretora.enumeracao.EstadoCivil;
import br.com.corretora.enumeracao.Sexo;
import br.com.corretora.profissao.Profissao;
import br.com.corretora.profissao.ProfissaoRN;
import br.com.corretora.corretor.Corretor;
import br.com.corretora.corretor.CorretorRN;
import br.com.corretora.relatorio.RelatorioUtil;
import br.com.corretora.util.FacesUtil;
import br.com.corretora.util.UtilException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.bean.*;
import org.jboss.logging.Logger;
import org.primefaces.context.RequestContext;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;

@ManagedBean(name = “clienteBean”)
@RequestScoped
public class ClienteBean {

private Cliente cliente = new Cliente();
private Profissao profissao;
private List<Cliente> lista;
private List<TipoPessoa> tipopessoas;
private List<Sexo> sexos;
private List<EstadoCivil> estadoscivis;
private List<Uf> estados;
private List<Corretor> corretores;
private List<Profissao> profissoes;

private String nomeCliente;

private String diretorio = "C:\\seguros\\arquivos\\";
private UploadedFile file;    

private StreamedContent arquivoRetorno;
private int relatorioSelecionado;

public ClienteBean() {
    limpar();
}       

private void limpar() {
    cliente = new Cliente();        
}

public String alterar() {
    return "/restrito/cadastro_cliente";
}    

public void salvar() {
    this.cliente.setStatus("Ativo");
    ClienteRN clienteRN = new ClienteRN();
    clienteRN.salvar(this.cliente);       
    limpar();   
}

public String ativar() {
    if (this.cliente.getStatus().contains("Ativo")) {
        this.cliente.setStatus("Inativo");
    }
    else {
        this.cliente.setStatus("Ativo");
    }

    ClienteRN clienteRN = new ClienteRN();
    clienteRN.salvar(this.cliente);
    return null;
}

public void buscarPorNome() {
    ClienteRN clienteRN = new ClienteRN();
    this.lista = clienteRN.buscarPorNome(getNomeCliente());
}

public boolean isEditando() {
    return this.cliente.getCodigo() != null;
}

public void transferirArquivo (String fileName, InputStream in) {
    try {
        OutputStream out = new FileOutputStream(new File(diretorio + fileName));
        int reader = 0;
        byte[] bytes = new byte[(int)getFile().getSize()];
        while ((reader = in.read(bytes)) != -1) {
            out.write(bytes, 0, reader);    
        }
        in.close();
        out.flush();
        out.close();
    } catch (IOException e) {
        System.out.println(e.getMessage());
    }
}

public void upload() {
   
    String extValidate;
    if (getFile() != null) {
        String ext = getFile().getFileName();
        if (ext != null) {
            extValidate = ext.substring(ext.indexOf(".")+1);
        }
        else {
            extValidate = "null";
        }
    
        if (extValidate.equals("pdf")) {
            try {
                transferirArquivo(getFile().getFileName(), getFile().getInputstream());
            } catch (IOException ex) {
                Logger.getLogger(ClienteBean.class.getName()).log(Logger.Level.FATAL, null, ex);
                FacesUtil.addErrorMessage("Erro ao enviar arquivo!");
            }
            FacesUtil.addInfoMessage("Arquivo enviado com sucesso!");
        }
        else {
            FacesUtil.addWarnMessage("Apenas arquivo com extensão .pdf!");
        }
    }
    else {
        FacesUtil.addErrorMessage("Selecione um arquivo!");
    }
}   

public void abrirDialogo() {
    Map<String,Object> opcoes = new HashMap<String, Object>();
    opcoes.put("modal", true);
    opcoes.put("draggable", false);
    opcoes.put("resizable", false);
    opcoes.put("contentHeight", 150);
    opcoes.put("contentWidth", 500);
     
    RequestContext.getCurrentInstance().openDialog("AdicionarProfissao", opcoes, null);
}

public StreamedContent getArquivoRetorno() {
String nomeRelatorioJasper;
String nomeRelatorioSaida;
RelatorioUtil relatorioUtil = new RelatorioUtil(); 
    
    try {
        switch (relatorioSelecionado) {
            case 1:
                nomeRelatorioJasper = "RelacaoClientes";
                nomeRelatorioSaida = "RelacaoClientes";
                this.arquivoRetorno = relatorioUtil.geraRelatorio(nomeRelatorioJasper, nomeRelatorioSaida, RelatorioUtil.RELATORIO_PDF);
                break;   
        
            case 2:
                nomeRelatorioJasper = "FichaCliente";
                nomeRelatorioSaida = "FichaCliente";
                this.arquivoRetorno = relatorioUtil.geraRelatorio(nomeRelatorioJasper, nomeRelatorioSaida, RelatorioUtil.RELATORIO_PDF);
                break;
        }
        
        return this.arquivoRetorno;
        
    } catch (UtilException e) {
        FacesUtil.addErrorMessage("Não foi possível gerar o relatório!");
        return null;
    }            
}

public void setArquivoRetorno(StreamedContent arquivoRetorno) {
    this.arquivoRetorno = arquivoRetorno;
}

public int getRelatorioSelecionado() {
    return relatorioSelecionado;
}

public void setRelatorioSelecionado(int relatorioSelecionado) {
    this.relatorioSelecionado = relatorioSelecionado;
}

public String getNomeCliente() {
    return nomeCliente;
}

public void setNomeCliente(String nomeCliente) {
    this.nomeCliente = nomeCliente;
}

public UploadedFile getFile() {
    return file;
}

public void setFile(UploadedFile file) {
    this.file = file;
}

public Cliente getCliente() {
    return cliente;
}

public void setCliente(Cliente cliente) {
    this.cliente = cliente;
}

public Profissao getProfissao() {
    return profissao;
}

public void setProfissao(Profissao profissao) {
    this.profissao = profissao;
}

public List<Cliente> getLista() {
    if (this.lista == null) {
        ClienteRN clienteRN = new ClienteRN();
        this.lista = clienteRN.buscarPorNome(nomeCliente);
    }
    return lista;
}

public List<TipoPessoa> getTipopessoas() {
    return tipopessoas = Arrays.asList(TipoPessoa.values());
}

public List<Sexo> getSexos() {
return sexos = Arrays.asList(Sexo.values());
} 

public List<EstadoCivil> getEstadoscivis() {
    return estadoscivis = Arrays.asList(EstadoCivil.values());
}

public List<Uf> getEstados() {
    return estados = Arrays.asList(Uf.values());
}    

public List<Corretor> getCorretores() {
    if (this.corretores == null) {
        CorretorRN corretorRN = new CorretorRN();
        this.corretores = corretorRN.listar();
    }
    return corretores;
}

public void setCorretores(List<Corretor> corretores) {
    this.corretores = corretores;
}

public List<Profissao> getProfissoes() {
    if (this.profissoes == null) {
        ProfissaoRN profissaoRN = new ProfissaoRN();
        this.profissoes = profissaoRN.listar();
    }
    return profissoes;
}

} `

faces-config.xml:
`<?xml version="1.0" encoding="UTF-8"?>

<application>
        <action-listener>org.primefaces.application.DialogActionListener</action-listener>
        <navigation-handler>org.primefaces.application.DialogNavigationHandler</navigation-handler>
        <view-handler>org.primefaces.application.DialogViewHandler</view-handler>

        <locale-config>
	<default-locale>pt_BR</default-locale>
        </locale-config>
</application>        
`

Olá sgrandini,

Realmente o problema está no front. Tente colocar toda a sua tela dentro de uma única h:form.