Combo de UF e Cidade - request

6 respostas
Andre.flu

Caros colegas,

Em anexo esta uma pequena aplicação com dois combos, um de estado e outro de cidade.

E gostaria de fazer algo básico: escolhido o estado listar as cidades daqueles estado, e na primeira execução vir o estado 01 selecionado e já suas cidades listadas.

Porém toda vez que me deparo com este problema: Validation Error: Value is not valid

Acabo tendo que colocar o escopo do bean como session e gostaria de fazer isso com request.

O que esta faltando fazer para um simple combode estado e cidade funcionar?

O código esta abaixo e o exemplo descrito no netbeans esta em anexo.
Obrigado pela atenção.

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        Hello from
        <h:form>
        <h:panelGrid cellpadding="15">
            <h:messages/>
            <h:selectOneMenu valueChangeListener="#{indexBean.valueChangeEstado}"
                             onchange="submit()"
                             value="#{indexBean.codigoEstado}">
                <f:selectItems value="#{indexBean.listaSelacaoEstado}" />
            </h:selectOneMenu>

            <h:selectOneMenu value="#{indexBean.codigoCidade}">
                <f:selectItems value="#{indexBean.listaSelacaoCidade}" />
            </h:selectOneMenu>

        </h:panelGrid>
        </h:form>
    </h:body>
</html>

e o bean:

package br;

import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

/**
 *
 * @author cunha
 */
@ManagedBean
@RequestScoped
public class IndexBean {

    private String codigoEstado;
    private String codigoCidade;
    private List<SelectItem> listaSelacaoEstado;
    private List<SelectItem> listaSelacaoCidade;


    /** Creates a new instance of IndexBean */
    public IndexBean() {
    }

    public void valueChangeEstado(ValueChangeEvent event){
        this.carregarCidade(event.getNewValue().toString());
    }

    private void carregarCidade(String codigo){

        this.listaSelacaoCidade = new ArrayList<SelectItem>();

        if( codigo.equals("1") ){

            this.listaSelacaoCidade.add( new SelectItem("1", "cidade 01 do estado 01"));
            this.listaSelacaoCidade.add( new SelectItem("2", "cidade 02 do estado 01"));


        }else if( codigo.equals("2") ){

            this.listaSelacaoCidade.add( new SelectItem("3", "cidade 01 do estado 02"));
            this.listaSelacaoCidade.add( new SelectItem("4", "cidade 02 do estado 02"));

        }

    }

    public List<SelectItem> getListaSelacaoCidade() {
        return listaSelacaoCidade;
    }

    public void setListaSelacaoCidade(List<SelectItem> listaSelacaoCidade) {
        this.listaSelacaoCidade = listaSelacaoCidade;
    }

    public List<SelectItem> getListaSelacaoEstado() {
        if( this.listaSelacaoEstado == null ){
            this.listaSelacaoEstado = new ArrayList<SelectItem>();
            this.listaSelacaoEstado.add(new SelectItem("1", "estado 01"));
            this.listaSelacaoEstado.add(new SelectItem("2", "estado 02"));
        }
        return listaSelacaoEstado;
    }

    public void setListaSelacaoEstado(List<SelectItem> listaSelacaoEstado) {
        this.listaSelacaoEstado = listaSelacaoEstado;
    }

    public String getCodigoCidade() {
        return codigoCidade;
    }

    public void setCodigoCidade(String codigoCidade) {
        this.codigoCidade = codigoCidade;
    }

    public String getCodigoEstado() {
        return codigoEstado;
    }

    public void setCodigoEstado(String codigoEstado) {
        this.codigoEstado = codigoEstado;
    }

}

6 Respostas

G

se eu entendi bem, você quer mostrar as cidades de acordo com com o estado selecionado certo?
então faz uma action no combo de cima e usa ajax pra preencher o combo abaixo

Andre.flu

Não quero usuar ajax, mesmo por que já tentei e não consegui pegar os valores do combo, até que atualizou.

Quero uma solução apenas com jsf, ou será que não é possível usando apenas jsf.

G

Andre.flu:
Não quero usuar ajax, mesmo por que já tentei e não consegui pegar os valores do combo, até que atualizou.

Quero uma solução apenas com jsf, ou será que não é possível usando apenas jsf.

é possível sim, dei a ideia de utilizar ajax pra poder renderizar apenas o combo cidade, mas se você quiser eu acho interessante você fazer uma ação no combo de estado de que quando escolhe um estado é lançada uma ação e essa ação é uma query que busca todas as cidades daquele estado e preenche o outro combo.

Andre.flu

guialeixo:
Andre.flu:
Não quero usuar ajax, mesmo por que já tentei e não consegui pegar os valores do combo, até que atualizou.

Quero uma solução apenas com jsf, ou será que não é possível usando apenas jsf.

é possível sim, dei a ideia de utilizar ajax pra poder renderizar apenas o combo cidade, mas se você quiser eu acho interessante você fazer uma ação no combo de estado de que quando escolhe um estado é lançada uma ação e essa ação é uma query que busca todas as cidades daquele estado e preenche o outro combo.

Sim, já esta fazendo isso quando no valueChange dou submit e ai passa no metodo que carrega a cidade de acordo com o estado selecionado, a questão é que lança a execption de validação, e não consigo resolver estar parte, os combos são atualizados normalmente.

G

manda a exception ai, ja debugou pra ver se os valores que estão entrando no combo são condizentes com o valor que o mesmo espera?

Andre.flu

Este erro de validation na tela: Validation Error: Value is not valid

Pega o projeto em anexo e roda ele, ao trocar o combo entre os estados na tela lança a execption, mas no servidor não.

E ai alguma idéia de como fazer isso funcionar??? ainda sem solução.

Criado 13 de dezembro de 2010
Ultima resposta 13 de dez. de 2010
Respostas 6
Participantes 2