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.