Problema Selectonemenu

4 respostas
Nader_Daher

Seguinte galera, estou a um tempão com esse problema, já tentei de várias maneiras consertar isso, mas sem sucesso…

TO fazendo um CRUD em JSF com Primefaces, ta funcionando td belez, mas na hora de alterar, eu tenho uma tabela com uma lista de clientes:

Uploaded with ImageShack.us

Para editar o cliente, eu clico no botão e abre um dialog com um form contendo os dados.

O problema eh que quando eu seleciono o primeiro cliente da lista os dados dos combos de estado e cidade, ficam armazenados no cache do navegador, e ao tentar editar os outros clientes ao invés de mostrar no combo o estado e cliente respectivo, mostra o do cliente que eu cliquei primeiro.

Alguem poderia ajudar?

4 Respostas

R

Nesse caso n tem nada a ver com cache de navegador e sim com a natureza orientada a componentes do JSF.

O que vc precisa é dar um jeito de ‘limpar’ o objeto corrente entre uma requisição e outra.

Nader_Daher

O problema é que eu não consiguo

R

Claro que consegue…posta o código.

Nader_Daher

Certo, já tentei de vários jeitos, mas vamos la…

aqui vou colocar só o dialog da página xhtml:

<p:dialog header="Detalhes do Cliente" widgetVar="clienteDialog" resizable="false" id="clienteDlg"
                              showEffect="fade" hideEffect="explode" modal="true">
                        <p:ajax event="onHide" listener="#{ClienteBean.limpaCombos}"/>

                        <h:panelGrid id="display" columns="2" cellpadding="4" style="margin:0 auto;">


                            <h:outputText value="Nome:" />
                            <h:panelGroup>
                                <h:outputText value="#{ClienteBean.selectedCliente.nome}" style="font-weight:bold" rendered="#{!ClienteBean.editMode}"/>
                                <p:inputText value="#{ClienteBean.selectedCliente.nome}" rendered="#{ClienteBean.editMode}" required="true" requiredMessage="Informe o Nome" label="Nome" style="text-transform:uppercase"/>
                            </h:panelGroup>

                            <h:outputText value="CPF/CNPJ:" />
                            <h:panelGroup>
                                <h:outputText value="#{ClienteBean.selectedCliente.cpfCnpj}" style="font-weight:bold" rendered="#{!ClienteBean.editMode}"/>
                                <p:inputText id="cpfCnpj" label="cpfCnpj" rendered="#{ClienteBean.editMode}" value="#{ClienteBean.selectedCliente.cpfCnpj}" maxlength="14" size="40"  required="true" requiredMessage="Informe o CPF/CNPJ" style="text-transform:uppercase"/>
                            </h:panelGroup>

                            <h:outputText value="Endereço:" />
                            <h:panelGroup>
                                <h:outputText value="#{ClienteBean.selectedCliente.endereco}" style="font-weight:bold" rendered="#{!ClienteBean.editMode}"/>
                                <p:inputText id="end" label="end" rendered="#{ClienteBean.editMode}" value="#{ClienteBean.selectedCliente.endereco}" maxlength="80" size="50" style="text-transform:uppercase" required="true" requiredMessage="Informe o Endereço"/>
                            </h:panelGroup>

                            <h:outputText value="Complemento:" />
                            <h:panelGroup>
                                <h:outputText value="#{ClienteBean.selectedCliente.complemento}" style="font-weight:bold" rendered="#{!ClienteBean.editMode}"/>
                                <p:inputText id="comple" label="comple" rendered="#{ClienteBean.editMode}" value="#{ClienteBean.selectedCliente.complemento}" maxlength="45" size="50" style="text-transform:uppercase" />
                            </h:panelGroup>

                            <h:outputText value="Número:" />
                            <h:panelGroup>
                                <h:outputText value="#{ClienteBean.selectedCliente.numero}" style="font-weight:bold" rendered="#{!ClienteBean.editMode}"/>
                                <p:inputText id="nro" label="nro" rendered="#{ClienteBean.editMode}" value="#{ClienteBean.selectedCliente.numero}" maxlength="10" size="40"  style="text-transform:uppercase"/>
                            </h:panelGroup>

                            <h:outputText value="CEP:" />
                            <h:panelGroup>
                                <h:outputText value="#{ClienteBean.selectedCliente.cep}" style="font-weight:bold" rendered="#{!ClienteBean.editMode}"/>
                                <p:inputMask id="cep" label="cep" rendered="#{ClienteBean.editMode}" value="#{ClienteBean.selectedCliente.cep}" mask="99999-999"  required="true" requiredMessage="Informe o Cep"/>
                            </h:panelGroup>

                            <h:outputText value="Bairro:" />
                            <h:panelGroup>
                                <h:outputText value="#{ClienteBean.selectedCliente.bairro}" style="font-weight:bold" rendered="#{!ClienteBean.editMode}"/>
                                <p:inputText id="bairro" label="bairro" rendered="#{ClienteBean.editMode}" value="#{ClienteBean.selectedCliente.bairro}" maxlength="30" size="50" style="text-transform:uppercase" />
                            </h:panelGroup>

                            <h:outputText value="Telefone1:" />
                            <h:panelGroup>
                                <h:outputText value="#{ClienteBean.selectedCliente.telefone1}" style="font-weight:bold" rendered="#{!ClienteBean.editMode}"/>
                                <p:inputMask id="tel1" label="tel1" rendered="#{ClienteBean.editMode}" value="#{ClienteBean.selectedCliente.telefone1}" mask="([telefone removido]" required="true" requiredMessage="Informe o telefone"/>
                            </h:panelGroup>

                            <h:outputText value="Telefone2:" />
                            <h:panelGroup>
                                <h:outputText value="#{ClienteBean.selectedCliente.telefone2}" style="font-weight:bold" rendered="#{!ClienteBean.editMode}"/>
                                <p:inputMask id="tel2" label="tel2" rendered="#{ClienteBean.editMode}" value="#{ClienteBean.selectedCliente.telefone2}" mask="([telefone removido]"/>
                            </h:panelGroup>


                            <h:outputText value="Estado:" />
                            <h:panelGroup>
                                <h:outputText value="#{ClienteBean.selectedCliente.uf}" style="font-weight:bold" rendered="#{!ClienteBean.editMode}"/>
                                <p:selectOneMenu id="estado" value="#{ClienteBean.nomeEstado}" rendered="#{ClienteBean.editMode}">
                                    <f:selectItem itemLabel="#{ClienteBean.selectedCliente.uf}" itemValue="#{ClienteBean.selectedCliente.uf}"/>
                                    <f:selectItems value="#{ClienteBean.estados}"/>
                                    <p:ajax update="cidade" listener="#{ClienteBean.atualizaCidades}"/>
                                </p:selectOneMenu>
                            </h:panelGroup>

                            <h:outputText value="Cidade:" />
                                <h:outputText value="#{ClienteBean.selectedCliente.cidade}" style="font-weight:bold" rendered="#{!ClienteBean.editMode}"/>
                                <p:selectOneMenu id="cidade" value="#{ClienteBean.nomeCidade}" rendered="#{ClienteBean.editMode}" required="true" requiredMessage="Selecione a Cidade">
                                    <f:selectItem itemLabel="#{ClienteBean.selectedCliente.cidade}" itemValue="#{ClienteBean.selectedCliente.cidade}"/>
                                    <f:selectItems value="#{ClienteBean.cidades}"/>
                                </p:selectOneMenu>

                            <f:facet name="footer">
                                <p:outputPanel rendered="#{ClienteBean.editMode}" layout="block" style="text-align:right">
                                    <p:commandButton value="Salvar" update="tbl1 avisos" actionListener="#{ClienteBean.alterarCliente}"
                                                     onclick="clienteDialog.hide()" image="ui-icon ui-icon-check"/>
                                    <p:commandButton value="Cancelar" onclick="clienteDialog.hide()" image="ui-icon ui-icon-close" actionListener="#{ClienteBean.limpaCombos}"/>

                                </p:outputPanel>
                            </f:facet>
                        </h:panelGrid>

                    </p:dialog>

Observe que no botão cancelar ele chama um método limpaCombos

Aqui o Bean:

package br.com.sacx.controls;

import br.com.sacx.daos.CidadeDAO;
import br.com.sacx.daos.ClienteDAO;
import br.com.sacx.daos.EstadoDAO;
import br.com.sacx.models.Cidade;
import br.com.sacx.models.Cliente;
import br.com.sacx.models.Estado;
import java.io.IOException;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

@ManagedBean
public class ClienteBean implements Serializable {

    private Cliente cliente = new Cliente();
    private ClienteDAO dao = new ClienteDAO();
    private EstadoDAO estadoDao = new EstadoDAO();
    private CidadeDAO cidadeDao = new CidadeDAO();
    private ArrayList<Cliente> listCliente = new ArrayList<Cliente>();
    private String nomeEstado;
    private String nomeCidade;
    private Map<String, String> estados = new HashMap<String, String>();
    private Map<String, Map<String, String>> cidadesData = new HashMap<String, Map<String, String>>();
    private Map<String, String> cidades = new HashMap<String, String>();
    private String nome;
    private String cpfCnpj;
    private Cliente selectedCliente;
    private boolean editMode;
    private String selectedUf;
    private String selectedCidade;

    public ClienteBean() throws SQLException {
        estados = new HashMap<String, String>();
        cidades = new HashMap<String, String>();
        // POPULA OS COMBOS
        for (Estado listaEstados : estadoDao.getEstado()) {
            estados.put(listaEstados.getUf(), listaEstados.getUf());
            System.out.println("----------------- ESTADO LIDO: " + listaEstados.getNome());

            Map<String, String> cidadesTemp = new HashMap<String, String>();
            for (Cidade listaCidades : cidadeDao.getCidade(listaEstados.getCodEstado())) {
                System.out.println("----------------- CIDADE LIDA: " + listaCidades.getNome());
                cidadesTemp.put(listaCidades.getNome(), listaCidades.getNome());
                //  cidades.put(listaCidades.getNome(), listaCidades.getNome());
            }
            cidadesData.put(listaEstados.getUf(), cidadesTemp);
        }
    }

    
   /* public String getSelectedUf(){

        selectedUf = getSelectedCliente().getUf();

        return selectedUf;
    }

     public String getSelectedCidade(){

        selectedCidade = getSelectedCliente().getCidade();

        return selectedCidade;
    }*/

    //  ATUALIZA COMBO CIDADE
    public void atualizaCidades() {
        if (getNomeEstado() != null && !getNomeEstado().equals("")) {
            cidades = cidadesData.get(getNomeEstado());
        } else {
            cidades = new HashMap<String, String>();
        }

    }

    public void consultarCliente() {
        String mensagem = "";

        if (getNome().trim().equals("") && getCpfCnpj().trim().equals("")) {
            mensagem = "Preencha pelo menos um campo";

            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Aviso:", mensagem));

        } else {

            try {
                setListCliente(dao.getClienteByNome(getNome(), getCpfCnpj()));

                //seando a lista na sessão
                //FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("listCliente", getListCliente());

                setNome(new String());
                setCpfCnpj(new String());

                if (getListCliente().isEmpty()) {
                    mensagem = "Não foram encontrados dados para sua consulta";
                } else {
                    mensagem = "Redirecionando...";
                }
            } catch (Exception e) {
                e.printStackTrace();
                mensagem = "Erro ao realizar consulta";
            }


            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Aviso", mensagem));

            try {
                if (getListCliente().isEmpty() == false) {
                    context.getExternalContext().redirect("faces/listacliente.xhtml");
                }
            } catch (IOException ex) {
                Logger.getLogger(Cliente.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

    }

    // SALVA NO BANCO
    public void salvar(ActionEvent event) {
        try {
            //Verifica se tem algum cliente com o mesmo CPF/CNPJ
            boolean verifica = dao.verificaCliente("", getCliente().getCpfCnpj());
            if (verifica == true) {
                String mensagem = "Já existe um cliente cadastrado com este CPF/CNPJ!";

                FacesContext context = FacesContext.getCurrentInstance();
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Aviso:", mensagem));

                //Para limpar os campos na página...
                setCliente(new Cliente());
                setNomeCidade(new String());
                setNomeEstado(new String());
            } else {

                int idEstado = estadoDao.getEstadoByUf(getNomeEstado());
                int idCidade = cidadeDao.getCidadeByNome(getNomeCidade());

                //Setando os id's do estado e cidade
                getCliente().setCodCidade(idCidade);
                getCliente().setCodEstado(idEstado);

                //Setando os campos para caixa alta
                getCliente().setNome(getCliente().getNome().toUpperCase());
                getCliente().setEndereco(getCliente().getEndereco().toUpperCase());
                getCliente().setComplemento(getCliente().getComplemento().toUpperCase());
                getCliente().setBairro(getCliente().getBairro().toUpperCase());

                dao.save(getCliente()); // salvando no banco de dados
                setCliente(new Cliente()); // criando um novo objeto para caso for inserir novamente
                setNomeEstado(new String());
                setNomeCidade(new String());
            }

        } catch (SQLException ex) {
            Logger.getLogger(ClienteBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void alterarCliente(ActionEvent event) {
        try {

            int idEstado = estadoDao.getEstadoByUf(getNomeEstado());
            int idCidade = cidadeDao.getCidadeByNome(getNomeCidade());

            //Setando os id's do estado e cidade
            getSelectedCliente().setCodCidade(idCidade);
            getSelectedCliente().setCodEstado(idEstado);

            //Setando os campos para caixa alta
            getSelectedCliente().setNome(getSelectedCliente().getNome().toUpperCase());
            getSelectedCliente().setEndereco(getSelectedCliente().getEndereco().toUpperCase());
            getSelectedCliente().setComplemento(getSelectedCliente().getComplemento().toUpperCase());
            getSelectedCliente().setBairro(getSelectedCliente().getBairro().toUpperCase());

            dao.update(getSelectedCliente()); // salvando no banco de dados
            setCliente(new Cliente()); // criando um novo objeto para caso for inserir novamente
            setNomeEstado(new String());
            setNomeCidade(new String());

            setListCliente(dao.getCliente());

            String mensagem = "Alterado com sucesso";

            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Aviso:", mensagem));

        } catch (SQLException ex) {
            Logger.getLogger(ClienteBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void delete(ActionEvent event) {
        try {


            dao.delete(getSelectedCliente());
            setCliente(new Cliente()); // criando um novo objeto para caso for inserir novamente
            setNomeEstado(new String());
            setNomeCidade(new String());

            setListCliente(dao.getCliente());

            String mensagem = "Excluído com sucesso";

            FacesContext context = FacesContext.getCurrentInstance();
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Aviso:", mensagem));

        } catch (SQLException ex) {
            Logger.getLogger(ClienteBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    //Método para Limpar os comobs uf, e cidade
    public void limpaCombos(ActionEvent event) {
        setNomeCidade(new String());
        setNomeEstado(new String());
    }

    /**
     * @return the cliente
     */
    public Cliente getCliente() {
        return cliente;
    }

    /**
     * @param cliente the cliente to set
     */
    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    /**
     * @return the estadoDao
     */
    public EstadoDAO getEstadoDao() {
        return estadoDao;
    }

    /**
     * @param estadoDao the estadoDao to set
     */
    public void setEstadoDao(EstadoDAO estadoDao) {
        this.estadoDao = estadoDao;
    }

    /**
     * @return the estados
     */
    public Map<String, String> getEstados() {
        return estados;
    }

    /**
     * @param estados the estados to set
     */
    public void setEstados(Map<String, String> estados) {
        this.estados = estados;
    }

    /**
     * @return the cidadesData
     */
    public Map<String, Map<String, String>> getCidadesData() {
        return cidadesData;
    }

    /**
     * @param cidadesData the cidadesData to set
     */
    public void setCidadesData(Map<String, Map<String, String>> cidadesData) {
        this.cidadesData = cidadesData;
    }

    /**
     * @return the cidades
     */
    public Map<String, String> getCidades() {
        return cidades;
    }

    /**
     * @param cidades the cidades to set
     */
    public void setCidades(Map<String, String> cidades) {
        this.cidades = cidades;
    }

    /**
     * @return the nomeEstado
     */
    public String getNomeEstado() {
        return nomeEstado;
    }

    /**
     * @param nomeEstado the nomeEstado to set
     */
    public void setNomeEstado(String nomeEstado) {
        this.nomeEstado = nomeEstado;
    }

    /**
     * @return the nomeCidade
     */
    public String getNomeCidade() {
        return nomeCidade;
    }

    /**
     * @param nomeCidade the nomeCidade to set
     */
    public void setNomeCidade(String nomeCidade) {
        this.nomeCidade = nomeCidade;
    }

    /**
     * @return the listCliente
     */
    public ArrayList<Cliente> getListCliente() {
        return listCliente;
    }

    /**
     * @param listCliente the listCliente to set
     */
    public void setListCliente(ArrayList<Cliente> listCliente) {
        this.listCliente = listCliente;
    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the cpfCnpj
     */
    public String getCpfCnpj() {
        return cpfCnpj;
    }

    /**
     * @param cpfCnpj the cpfCnpj to set
     */
    public void setCpfCnpj(String cpfCnpj) {
        this.cpfCnpj = cpfCnpj;
    }

    /**
     * @return the selectedCliente
     */
    public Cliente getSelectedCliente() {
        return selectedCliente;
    }

    /**
     * @param selectedCliente the selectedCliente to set
     */
    public void setSelectedCliente(Cliente selectedCliente) {
        this.selectedCliente = selectedCliente;
    }

    /**
     * @return the editMode
     */
    public boolean isEditMode() {
        return editMode;
    }

    /**
     * @param editMode the editMode to set
     */
    public void setEditMode(boolean editMode) {
        this.editMode = editMode;
    }

    /**
     * @param selectedUf the selectedUf to set
     */
    public void setSelectedUf(String selectedUf) {
        this.selectedUf = selectedUf;
    }

    /**
     * @param selectedCidade the selectedCidade to set
     */
    public void setSelectedCidade(String selectedCidade) {
        this.selectedCidade = selectedCidade;
    }
}

O bean tem o scope = session

Criado 9 de dezembro de 2011
Ultima resposta 9 de dez. de 2011
Respostas 4
Participantes 2