Boa noite pessoal,
tenho o seguinte código que estou fazendo para estudar o richfaces, porém tenho um problema:
Se eu deixo a jsp com vários forms, ao clicar no botão Salvar ou Pesquisar, os dados do ManagedBean não são atualizados com os dados do formulário de edição, mas chama o método com os dados desatualizados.
Se eu deixo a jsp com um form, o botão de Alterar chama o método mas a view não é atualizada (O form fica em branco).
No que vocês puderem ajudar eu fico grato, e peço desculpas por postar um código imenso no fórum.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<ui:composition template="../template.xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:rich="http://richfaces.org/rich">
<ui:define name="titulo">Cadastro de Clientes</ui:define>
<ui:define name="conteudo">
<f:view>
<a4j:region>
<a4j:keepAlive beanName="ClienteBean" />
<a4j:status onstart="Richfaces.showModalPanel('carregando');" onstop="Richfaces.hideModalPanel('carregando');" />
<rich:modalPanel id="carregando" autosized="true" moveable="false" resizeable="false">
<h:graphicImage value="../static/images/loading.gif" />
</rich:modalPanel>
<a4j:outputPanel id="mensagem">
<rich:messages style="color:red;" />
</a4j:outputPanel>
<a4j:form>
<a4j:outputPanel>
<rich:panel id="form">
<f:facet name="header">
<h:outputText value="Cadastro de Clientes" />
</f:facet>
<h:inputHidden value="#{ClienteBean.cliente.id}" />
<h:panelGrid columns="3">
<h:outputText value="Nome" />
<h:inputText value="#{ClienteBean.cliente.nome}" id="nome" size="50" maxlength="50" required="true" tabindex="1">
<f:validateLength minimum="3" maximum="50" />
</h:inputText>
<rich:messages for="nome" />
<h:outputText value="Sexo" />
<h:selectOneMenu value="#{ClienteBean.cliente.sexo}" id="sexo" required="true" tabindex="2">
<f:selectItem itemLabel="... Selecione ..." itemValue="" />
<f:selectItem itemLabel="Masculino" itemValue="M" />
<f:selectItem itemLabel="Feminino" itemValue="F" />
</h:selectOneMenu>
<rich:message for="sexo" />
<h:outputText value="Data de Nascimento" />
<rich:calendar value="#{ClienteBean.cliente.dataNascimento}" id="dataNascimento" datePattern="dd/MM/yyyy" required="true" tabindex="3">
<f:convertDateTime pattern="dd/MM/yyyy"/>
</rich:calendar>
<rich:message for="dataNascimento" />
<h:outputText value="Endereço" />
<h:inputText value="#{ClienteBean.cliente.endereco}" id="endereco" size="50" maxlength="50" required="true" tabindex="4">
<f:validateLength minimum="3" maximum="50" />
</h:inputText>
<rich:message for="nome" />
<h:outputText value="Cep" />
<h:inputText value="#{ClienteBean.cliente.cep}" id="cep" size="10" maxlength="9" required="true" tabindex="5">
<f:converter converterId="CepConverter" />
</h:inputText>
<rich:message for="cep" />
<h:outputText value="Bairro" />
<h:inputText value="#{ClienteBean.cliente.bairro}" id="bairro" size="30" maxlength="30" required="true" tabindex="6" />
<rich:message for="bairro" />
<h:outputText value="Cidade" />
<h:inputText value="#{ClienteBean.cliente.cidade}" id="cidade" size="30" maxlength="30" required="true" tabindex="7" />
<rich:message for="cidade" />
<h:outputText value="Estado" />
<h:inputText value="#{ClienteBean.cliente.estado}" id="estado" size="3" maxlength="2" required="true" tabindex="8" />
<rich:message for="estado" />
<h:outputText value="Telefone" />
<h:inputText value="#{ClienteBean.cliente.telefone}" id="telefone" size="15" maxlength="13" required="true" tabindex="9">
<f:converter converterId="TelefoneConverter" />
</h:inputText>
<rich:message for="telefone" />
<h:outputText value="Celular" />
<h:inputText value="#{ClienteBean.cliente.celular}" id="celular" size="15" maxlength="13" required="true" tabindex="10">
<f:converter converterId="TelefoneConverter" />
</h:inputText>
<rich:message for="celular" />
</h:panelGrid>
</rich:panel>
</a4j:outputPanel>
</a4j:form>
<a4j:form>
<a4j:outputPanel>
<rich:panel id="botoes">
<h:panelGrid columns="4" rendered="#{ClienteBean.modoEdicao}">
<a4j:commandButton value="Salvar" action="#{ClienteBean.salvar}" reRender="botoes,form" />
<a4j:commandButton value="Cancelar" action="#{ClienteBean.cancelar}" reRender="botoes,form" immediate="true" />
</h:panelGrid>
<h:panelGrid columns="4" rendered="#{ClienteBean.modoPesquisa}">
<a4j:commandButton value="Pesquisar" action="#{ClienteBean.pesquisar}" reRender="botoes,tabela" immediate="true" />
<a4j:commandButton value="Incluir" action="#{ClienteBean.incluir}" reRender="botoes,form" />
</h:panelGrid>
</rich:panel>
</a4j:outputPanel>
</a4j:form>
<a4j:form>
<a4j:outputPanel>
<rich:dataTable id="tabela" var="cliente" value="#{ClienteBean.model}" width="100%" rows="10">
<f:facet name="header"><h:outputText value="Cadastro de Clientes" /></f:facet>
<rich:column>
<f:facet name="header">
<h:outputText value="Nome" />
</f:facet>
<h:outputText value="#{cliente.nome}" />
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Ações" />
</f:facet>
<a4j:commandLink id="botaoAlterar" action="#{ClienteBean.alterar}" reRender="botoes,form" immediate="true">
<h:graphicImage value="../static/images/alterar.gif" style="border:0" />
</a4j:commandLink>
<rich:toolTip for="botaoAlterar" value="Alterar" />
<a4j:commandLink id="botaoExcluir" action="#{ClienteBean.excluir}" reRender="tabela" immediate="true">
<h:graphicImage value="../static/images/excluir.gif" style="border:0" />
</a4j:commandLink>
<rich:toolTip for="botaoExcluir" value="Excluir" />
</rich:column>
<f:facet name="footer">
<rich:datascroller for="tabela" reRender="tabela" maxPages="15" />
</f:facet>
</rich:dataTable>
</a4j:outputPanel>
</a4j:form>
</a4j:region>
</f:view>
</ui:define>
</ui:composition>
package br.com.vinicius.cadastro.controller;
import java.io.Serializable;
import java.util.List;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import br.com.vinicius.cadastro.model.bean.Cliente;
import br.com.vinicius.cadastro.model.dao.ClienteDao;
public class ClienteBean implements Serializable {
private static final long serialVersionUID = 1L;
private Modo modoAtual = Modo.PESQUISA;
private Cliente cliente = new Cliente();
private DataModel model = new ListDataModel();
private ClienteDao clienteDao = new ClienteDao();
public Modo getModoAtual() {
return modoAtual;
}
public void setModoAtual(Modo modoAtual) {
this.modoAtual = modoAtual;
}
public Boolean getModoPesquisa() {
return Modo.PESQUISA.equals(modoAtual);
}
public Boolean getModoEdicao() {
return Modo.EDICAO.equals(modoAtual);
}
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
public DataModel getModel() {
return model;
}
public void setModel(DataModel model) {
this.model = model;
}
public ClienteDao getClienteDao() {
return clienteDao;
}
public void setClienteDao(ClienteDao clienteDao) {
this.clienteDao = clienteDao;
}
public void pesquisar() {
List<Cliente> clientes = clienteDao.find(cliente);
getModel().setWrappedData(clientes);
}
public void incluir() {
cliente = new Cliente();
modoAtual = Modo.EDICAO;
}
public void alterar() {
cliente = (Cliente) model.getRowData();
modoAtual = Modo.EDICAO;
}
public void salvar() {
clienteDao.merge(cliente);
modoAtual = Modo.PESQUISA;
}
public void cancelar() {
cliente = new Cliente();
modoAtual = Modo.PESQUISA;
}
public void excluir() {
Cliente cliente = (Cliente) model.getRowData();
List<Cliente> clientes = (List<Cliente>) model.getWrappedData();
clienteDao.remove(cliente);
clientes.remove(clientes.indexOf(cliente));
}
}