[Ajuda] Setar num SelectItem a cidade referente ao estado selecionado em um SelectItem anterior

2 respostas
marcellofdv

Para esclarecer melhor o meu problema, eu tenho duas tabelas no banco de dados, uma com todos os estados e outra com todas as cidades (assim eu creio), em uma aplicação para desktop eu consegui fazer com que, ao selecionar o estado em uma comboBox, a comboBox das cidades fosse preenchidas automaticamente somente com as cidades referentes a tal estado selecionado.

Neste mesmo projeto, agora para web, estou usando JSP e Hibernate, aí é que o bicho pegou, não tenho muitos conhecimentos de java, eu consegui pupular os menus tanto com os estados quanto com as cidades, porém, não da forma que gostaria.

Aqui está os códigos que tenho até agora.

A classe tb_estados que foi feito um mapeamento por ela.

package membrus.bean;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;


@Entity
public class tb_estados implements Serializable {
    private Integer id;
    private String uf;
    private String nome;

    @Id
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

    

}

A Classe tb_cidades que também foi mapeada por anotação

package membrus.bean;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class tb_cidades implements Serializable {
    @Id
    private Integer id;
    @ManyToOne
    private tb_estados estado;
    private String uf;
    private String nome;

    public tb_estados getEstado() {
        return estado;
    }

    public void setEstado(tb_estados estado) {
        this.estado = estado;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getUf() {
        return uf;
    }

    public void setUf(String uf) {
        this.uf = uf;
    }

    

}

Meu ManegedBean que pupula tanto o menu estado quanto o menu cidade.

public class Cidades_EstadosBean {

        public List<SelectItem> getEstado() {
        Session session = FacesContextUtil.getRequestSession();
        InterfaceDAO<tb_estados> estadosDao = new HibernateDAO<tb_estados>(tb_estados.class, session);
        List<tb_estados> estados = estadosDao.getBeans();
        session.getTransaction().commit();
        List<SelectItem> selecionaEstados = new ArrayList<SelectItem>();
        for (tb_estados estado: estados) {
            selecionaEstados.add(new SelectItem(estado.getId().toString(), estado.getUf()));
        }return selecionaEstados;
    }
    
    public List<SelectItem> getCidades() {
        Session session = FacesContextUtil.getRequestSession();
        InterfaceDAO<tb_cidades> cidadesDao = new HibernateDAO<tb_cidades>(tb_cidades.class, session);
        List<tb_cidades> cidades = cidadesDao.getBeans();
        List<SelectItem> selecionaCidades = new ArrayList<SelectItem>();
        for (tb_cidades cidade: cidades) {
            selecionaCidades.add(new SelectItem(cidade.getId().toString(), cidade.getNome()));
        }
        return selecionaCidades;
    }

E a minha pagina onde eu chamo os estados e as cidades.

<f:view>
        <div id="Pagina">
            <div id="Principal">
                <h3 align="center"> Cadastrar Congrega&ccedil;&otilde;es </h3><br><br>
                <div id="CadastroCongregacao">
                    <h:form>
                        Congrega&ccedil;&atilde;o <h:inputText value="" /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        Endereço <h:inputText value="" /> <br> <br><br>
                        <h:outputLabel value="Estado" />
                        <h:selectOneMenu id="selecionaEstados" value="#{membrosBean.codigoEstado}">
                            <f:selectItems value="#{cidades_EstadosBean.estado}"/>
                        </h:selectOneMenu>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        <h:outputLabel value="Cidade" />
                        <h:selectOneMenu id="selecionaCidades" value="#{membrosBean.codigoEstado}">
                            <f:selectItems value="#{cidades_EstadosBean.cidades}" />
                        </h:selectOneMenu>
                        <br><br><br>
                        Pastor <h:inputText value="" /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        Telefone <h:inputText value="" /> <br><br><br>
                        Email <h:inputText value="" /> <br><br><br>                        
                    </h:form>
                    <h:form>
                        <h:commandLink value="Voltar" action="retornar" />
                    </h:form>
                </div>
            </div>
        </div>
    </f:view>

Se alguem puder dá uma luz de como eu saio desta enrascada, ficarei muito agradecido, já pesquisei, tentei fazer sozinho mais não consegui.

Desde já agradeço a todos que se disponibilizarem para ajudar.

2 Respostas

A

Recomendo aprofundar um pouco mais seus estudos antes de começar a desenvolver para Web. Você tá usando tb_estados como nome de classe, deveria ser somente Estado. Outra coisa:

session.getTransaction().commit();

Por que tá fazendo commit se é só um método de consulta? Recomendo que você pesquise umas edições antigas da Java Magazine onde tem aquelas aplicações completas e parta daí. E procure aprender mais o básico, não pule etapas.
Se precisar de mais ajuda posta aí.

marcellofdv

Recomendo aprofundar um pouco mais seus estudos antes de começar a desenvolver para Web. Você tá usando tb_estados como nome de classe, deveria ser somente Estado. Outra coisa:

session.getTransaction().commit();

Por que tá fazendo commit se é só um método de consulta? Recomendo que você pesquise umas edições antigas da Java Magazine onde tem aquelas aplicações completas e parta daí. E procure aprender mais o básico, não pule etapas.
Se precisar de mais ajuda posta aí.

Opa, obrigado por responder, bom, vamos lá.
Quanto a desenvolver para Web, neste semestre da faculdade, nosso sistema terá que ser pra web já que no semestre passado foi para desktop, então, estou adaptando ou melhor, refazendo ele só que para web, porém, no que foi desenvolvido anteriormente, não usei Hibernate, daí algumas dificuldades.

Quanto o nome da classe, preferi deixa-la com o mesmo nome da tabela, achei mais facil assim e creio que não esteja prejudicando o funcionamento (se bem que não está funcionando).

Referente ao codigo observado por voce, realmente foi uma falha minha, eu até tinha tirado ele do meu codigo, mas deva ter voltado ao dar um Ctrl+Z, na verdade não iria mais utilizar este commit em parte alguma, já que uma outra classe é responsavel por fazer isto.

Obrigadão pela sugestão, vou procurar correr atras disto e mais outros tantos artigos que eu encontrar, este sistema na verdade, é minha forma de aprender, acho que eu e tantas pessoas aprendem deste jeito, colocando a mão na massa mesmo, e mais uma vez, muito obrigado por se disponibilizar em ajudar.

Criado 4 de janeiro de 2011
Ultima resposta 4 de jan. de 2011
Respostas 2
Participantes 2