Componente Estado Cidade

Alguém ai já pensou em desenvolver um componente em JSF para carregar cidades e estados em um combo?

É chato demais ter que ficar alimentando o combo na mão toda hora…

[quote=faelbsr]Alguém ai já pensou em desenvolver um componente em JSF para carregar cidades e estados em um combo?

É chato demais ter que ficar alimentando o combo na mão toda hora…[/quote]

Como assim alimentando na mão a toda hora?

[quote=romarcio][quote=faelbsr]Alguém ai já pensou em desenvolver um componente em JSF para carregar cidades e estados em um combo?

É chato demais ter que ficar alimentando o combo na mão toda hora…[/quote]

Como assim alimentando na mão a toda hora?[/quote]+1

Por que não tem isso no DB e busca de lá? O.o

Eu implemento isso buscando no banco de dados…

Eu queria saber se não seria interessante já existir um componente pronto para só chamar ele e já listar os estados e cidades sem precisar nenhuma busca ao banco de dados ou outra fonte…

Pois isso é algo que sempre estamos precisando usar em mais de uma parte do sistema…

[quote=faelbsr]Eu implemento isso buscando no banco de dados…

Eu queria saber se não seria interessante já existir um componente pronto para só chamar ele e já listar os estados e cidades sem precisar nenhuma busca ao banco de dados ou outra fonte…

Pois isso é algo que sempre estamos precisando usar em mais de uma parte do sistema…[/quote]Mas se incluírem uma cidade? como faria?

Até agora não entendi qual o problema… O.o

Tem como você colocar um pseudo código de como seria esse componente?

Mas imagina um componente armazenando milhares de cidades, é meio estranho isso. Qual seria o tamanho desse componente em bytes? Talvez mega bytes para armazenar apenas as cidades do Brasil.

Constrói então um web-service, gera uma biblioteca para ler esse web-service sempre que necessário e adiciona a biblioteca ao seu projeto e faz ela carregar a lista de cidades no componente sempre que preciso.

[quote=romarcio]Mas imagina um componente armazenando milhares de cidades, é meio estranho isso. Qual seria o tamanho desse componente em bytes? Talvez mega bytes para armazenar apenas as cidades do Brasil.

Constrói então um web-service, gera uma biblioteca para ler esse web-service sempre que necessário e adiciona a biblioteca ao seu projeto e faz ela carregar a lista de cidades no componente sempre que preciso.[/quote]Pensei o mesmo.

Por isso pedi um pseudo código para tentar entender melhor o que ele quer.

Realmente escrever tudo em um bloco de código é sem sentido. O.o

Vou explicar melhor o que estou propondo.

Abaixo segue o código de como eu implemento um combo [select] Estado e Cidade. A minha ideia seria um componente que eu chamaria e ele já carregaria pra mim todos os estados e cidades brasileiros sem eu precisar ficar buscando no banco de dados, sacou;

JSP


<p:column>Estado:</p:column>
                                    <p:column>
                                        <p:selectOneMenu id="estado" style="width: 100%" value="#{pessoaFaces.selectedEstado}">                                        
                                            <f:selectItems var="e" itemLabel="#{e}" value="#{pessoaFaces.estados}"></f:selectItems>
                                            <p:ajax event="change" listener="#{pessoaFaces.atualizaCidades}" update="cidade"></p:ajax>                                            
                                        </p:selectOneMenu>
                                    </p:column>


                                    <p:column>Cidade:</p:column>
                                    <p:column>
                                        <p:selectOneMenu                                                
                                            required="true" 
                                            requiredMessage="O campo CIDADE é de preenchimento obrigatório"
                                            id="cidade" style="width: 100%" value="#{pessoaFaces.selectedAluno.cidades}">
                                            <f:converter converterId="CidadesConverter"></f:converter>
                                            <f:selectItems var="c" value="#{pessoaFaces.cidades}" itemValue="#{c}" itemLabel="#{c.cidade}"></f:selectItems>                                    
                                        </p:selectOneMenu>
                                    </p:column>                                    

BEAN

private String[] listaEstados = {"", "AC-ACRE",
        "AL-ALAGOAS",
        "AP-AMAPÁ",
        "AM-AMAZONAS",
        "BA-BAHIA",
        "CE-CEARÁ",
        "DF-DISTRITO FEDERAL",
        "GO-GOIÁS",
        "ES-ESPÍRITO SANTO",
        "MA-MARANHÃO",
        "MT-MATO GROSSO",
        "MS-MATO GROSSO DO SUL",
        "MG-MINAS GERAIS",
        "PA-PARÁ",
        "PR-PARAÍBA",
        "PA-PARANÁ",
        "PE-PERNAMBUCO",
        "PI-PIAUÍ",
        "RJ-RIO DE JANEIRO",
        "RN-RIO GRANDE DO NORTE",
        "RS-RIO GRANDE DO SUL",
        "RO-RONDÔNIA",
        "RR-RORÂIMA",
        "SP-SÃO PAULO",
        "SC-SANTA CATARINA",
        "SE-SERGIPE",
        "TO-TOCANTINS"};

public List<String> getEstados() {

        List<String> toReturn = Arrays.asList(listaEstados);

        return toReturn;

    }//end method

   public void atualizaCidades() {

        CidadesDao cDao = new CidadesDao();

        String estado = "";

        if (!selectedEstado.equals("")) {

            String[] split = selectedEstado.split("-");

            estado = split[0];

        }//end if

        cidades = cDao.getCidadesByEstado(estado);

    }
  1. Você poderia melhorar utilizando um Enum ao invés de criar esse array na unha toda vez. Desse modo o enum poderia ser utilizado em todo lugar.
  2. Se for adicionadas cidades, lembre-se que teria que ser alterado no código do componente e não no DB.

Você pode construir um componente que faça isso sempre com JSF de modo em simples. Pesquise na net: jsf custom components

Desse modo você terá um componente que será sempre reutilizado e faça a mesma coisa.

Obrigado, vou procurar saber como implementa um componente customizado…

Queria saber se já existia algum do tipo, mas parece que não…

Obrigado a todos…

[quote=faelbsr]Obrigado, vou procurar saber como implementa um componente customizado…

Queria saber se já existia algum do tipo, mas parece que não…

Obrigado a todos…[/quote]Nunca vi algo do tipo. Não é boa prática, por isso que não acho que você encontraria. [=

A ideia do componente é interessante. Também estou pensando em implementar um componente, pois tenho dois tipos de códigos espalhados no sistema: Pais -> Estado -> Cidade -> Bairro e Pais -> Estado -> Cidade. Quando um estado muda, por exemplo, é necessário atualizar os campos Cidade e Bairro. Assim, no caso onde se deseja selecionar o bairro (que depende da cidade que depende do estado que depende do pais), é necessário ter os campos pais, estado e cidade no controller e realizar os tratamentos necessários quando esses campos mudam.

No caso, estou pensando em implementar 3 componentes:

  • SelectEstado (Pais -> Estado)

  • SelectCidade (Pais -> Estado -> Cidade)

  • SelectBairro (Pais -> Estado -> Cidade -> Bairro)

O pseudo-código de uso seria mais ou menos assim:

<bs:selectBairro value="#{controller.entity.endereco.bairro}"/>

Esse componente renderezaria 3 : Estado, Cidade e Bairro.