Olá desenvolvedores, na quinta parte deste tutorial sobre combos dependentes carregaremos o combo de cidades a partir do Estado selecionado. No tutorial “COMBOS-DEPENDENTES-DISPARANDO-O-AJAX” demos início a implementação do método carregarCidades().

De forma sucinta, no método carregarCidades() conseguimos obter do componente que disparou o evento o identificador “id”, ou seja, o código do Estado que foi selecionado. O método implementa ainda uma condição para verificar se o código obtido realmente é válido.

if(codigoEstado != null){}

Agora, dentro dessa estrutura de decisão, se o código obtido for realmente válido, o Estado correspondente será “puxado” da base de dados. Por meio do “entityManager”, acionaremos o método find() que como parâmetro recebe a classe cujos dados queremos obter e a “primary key” (chave primária) que por ser do “tipo Long”, precisa ser convertida.

A Entidade Pessoa implementa o atributo “Estado estado” apenas para que este possa ser trabalhado em memória. Assim, considerando este atributo criaremos uma estrutura de decisão aninhada para verificar se o dado obtido é realmente diferente de nulo. Se for diferente de nulo, o estado será “setado”, no objeto pessoa, que é controlado pelo ManagedBean.

Ainda dentro da estrutura da decisão aninhada, precisaremos agora obter a lista de cidades. O primeiro passo é no criar como atributo no “PessoaBean” a lista de cidades, implementando também para a lista os métodos Getters and Setters.

private List<SelectItem> cidades;

Voltando a estrutura de decisão carregaremos a lista. Com o “createQuery” traremos a lista de cidades onde o “id” do Estado for igual ao código do Estado correspondente. Na sequência instanciamos uma “ArrayList”.

Então implementaremos um “forEach” para percorrer a lista de cidades, e adicionar na lista instanciada “List<SelectItem>”, o “id” e os nomes das cidades. E por fim, fora do laço de repetição passaremos a lista de cidades adicionadas para o “setCidades”.

ENTENDENDO O FLUXO DE PROCESSAMENTO

Quando o Estado for selecionado o método carregarCidades() será invocado, e o “id” do Estado que foi selecionado obtido. Obtendo o “id”, o Estado correspondente foi carregado na base de dados e validado.

Após a validação adicionamos o Estado na variável pessoa, e então realizamos a consulta a base de dados pelo código do Estado por meio do SQL. E finalmente para carregar o combo que listará as cidades criamos uma lista do tipo <SelectItem>, e no “forEach” percorremos a lista adicionando-a a uma variável.

A lista obtida foi adicionada ao “setCidades” para que quando enviarmos o combo de cidades via Ajax, elas deverão ser carregadas e o “get” será invocado.

COMBO CIDADES

Antes de implementar o combo que listará as cidades, criaremos o atributo cidades, na classe Entidade Pessoa, e como várias cidades poderão estar relacionadas a um único Estado, o atributo será precedido pela anotação @ManyToOne. Gere também para este atributo os métodos Getters and Setters.

@ManyToOne
private Cidades cidades;

Na primeirapagina.xhtml criaremos o combo que listará as cidades, começando pelo componente que identifica o campo, o h:outputLabel. O “value” do h:selectOneMenu atribuirá o valor selecionado ao atributo cidade do objeto pessoa.

Atribuiremos também um “id”, a partir do qual o Ajax renderizará o combo de cidades, isto é, o f:ajax do combo de “Estados” terá a propriedade render=”comboCidades”.

O h:selectItens é que será o responsável por de fato listar as cidades de acordo com o Estado selecionado. Visto que ele terá a incumbência de chamar o “get” do “PessoaBean”.

Poderemos criar ainda um f:selectItem com a propriedade “itemLabel” exibindo um valor não selecionável, mas que compreende uma orientação ao usuário.

EM POUCAS PALAVRAS

Neste tutorial trabalhamos com o método carregarCidades(), e conseguimos fazer com que o combo de cidades liste todas as cidades correspondentes ao Estado selecionado. No próximo tutorial converteremos o objeto selecionado na tela em um objeto da Entidade, e para isso será preciso criar um “Converter”.