Re:Filtrar cidades em JSF 2.0

7 respostas
V

Se estiver usando richfaces, tente isso:

<a4j:support event="onchange" action="#{meuBean.selecionaCidades}" reRender="tabelaCidades" />

7 Respostas

V

Cara, você tem duas opções.

  1. Usar ajax para atualizar o filtro;
  2. adicionar o evento javascript onchange=“submit()” ao selectOneMenu.
C
D

Olá pessoal.

Procurei em tudo que é canto e não achei nada a respeito e tentei de tudo que é jeito que podia imaginar e não consegui…

Objetivo: Filtrar cidades de um MBean por estado selecionado.

Vejam o que quero fazer:
Selecionar o estado e executar a ação valueChangeListener.

<h:selectOneMenu id="siglaEstado" value="#{Cidades.sigEst}" immediate="true" valueChangeListener="#{Cidades.valueChangeListener}" >
   <f:selectItem itemLabel="Acre" itemValue="AC" />
   <f:selectItem itemLabel="Amapá" itemValue="AP" />
   ........
</h:selectOneMenu>

A ação preenche uma lista de cidades filtrando pelo estado selecionado.

public String estadoSelecionado;
public List<Cidades> listCodCi = new ArrayList<Cidades>();

public void valueChangeListener(ValueChangeEvent event) {
   System.out.println("novo estado selecionado: " + event.getNewValue());
   estadoSelecionado = event.getNewValue().toString();
   listCodCid = Cidades.buscar(getEstadoSelecionado());
   for(int i = 0; i < listCodCid1.size(); i++)
      System.out.println("Cidade: " + listCodCid.get(i).getCodCid());
}

O problema é que se eu popular a lista desta maneira, o JSF recebe ela vazia.
Se eu popular ela pelo construtor, o JSF recebe a lista só que sem o filtro, isto é, recebe todas as cidades. Isto porque quando preencho a lista no construtor, o estadoSelecionado está vazio.

O que vocês me sugerem?

D

Alguém ??

Eu até pensei em passar um parâmetro <f:param, mas não deu muito certo.

O máximo que cheguei foi assim:
Eu selecionava um estado, p. ex: SP.
Pesquisa as cidades e vinha todas de todos os estados.
Depois mudava o estado para, MG p. ex., e vinham as cidades de SP, isto é, sempre considerando o estado anterior selecionado.

D

É, eu até achei isso, mas não queria usar a4j pra isso.

Onde você disse:
reRender=“tabelaCidades”

Acontece o seguinte:
Eu tenho esta lista para selecionar o estado.
E tem um botão que abre um dialog que tem uma tabela com as cidades, que deverão ser as cidades de acordo com o estado selecionado na lista…

Tens mais sugestões ?

D

Ninguém ?
Eu acredito que a maioria já passou por isso, pois é algo que é necessário em praticamente todo tipo de aplicação.

Por exemplo:
Você quer listar os carros (em uma tabela) de determinado ano. Esse ano o usuário seleciona em um combo ou radio… Sem bean para o ano.
A lista de Carros (bean) deve considerar o ano que foi selecionado na página…

Eu já tentei de tudo e procurei muito antes de recorrer ao fórum…

D

Consegui.
Vou deixar aqui para quem precisar…

NetBeans 6.8
GlassFish v3
PrimeFaces 2.0.2
JSF 2 (Mojarra)

Formulário que lista as cidades de acordo com o estado (comboBox) selecionado

<h:selectOneMenu id="estados" value="#{Regiao.estadoSelecionado}" >
   <f:selectItem itemLabel="Acre" itemValue="AC" />
   <f:selectItem itemLabel="Amapá" itemValue="AP" />
   <f:selectItem itemLabel="Amazonas" itemValue="AM" />
   ...
   // Executa o método que carrega as cidades ao mudar o estado
   <p:ajax  update="formCid:tblCid" process="estados" event="change" actionListener="#{Regiao.actionCarregarCidades}" />
</h:selectOneMenu>

...
// Botão para abrir um dialog que lista as cidades
<p:commandLink value="Listar Cidades" oncomplete="formCid:dialogCid.show()" title="Pesquisar" />

// Formulário na mesma página que abre o dialog com as cidades do estado selecionado
<h:form id="formCid">
   <p:dialog header="Cidades"  widgetVar="dialogCid" fixedCenter="true"
              width="550px" height="420px" modal="true" >
      <p:outputPanel style="text-align:center;" layout="block">
         <p:dataTable id="tblCid" var="cid" value="#{Regiao.listCodCid}" paginator="true" rows="10"
                     selectionMode="single" selection="#{Regiao.beanCidades}" loadingMessage="Carregando...">
            <p:column>
               <f:facet name="header">
                  <h:outputText value="Código" />
               </f:facet>
               <h:outputText value="#{cid.codCid}" />
                  </p:column>
               <p:column>
               <f:facet name="header">
                  <h:outputText value="Nome" />
               </f:facet>
               <h:outputText value="#{cid.nomCid}" />
            </p:column>

         </p:dataTable>

         <p:commandButton value="Selecionar" update="formDad:cidSel" oncomplete="dialogCid.hide();" />
      </p:outputPanel>

   </p:dialog>
</h:form>

E abaixo, os métodos do Bean Regiao

@ManagedBean(name = "Regiao")
@RequestScoped
public class Regiao implements Serializable {

public String estadoSelecionado;
public List<Cidades> listCodCid;
public Cidades beanCidades = new Cidades();

... get's e set's

public void actionCarregarCidade() {
   this.listCodCid = getListCodCid();
}

public List<R074CID> getListCodCid() {
   List<R074CID> cidades;
   if(estadoSelecionado != null && estadoSelecionado.length() > 0) {
      cidades = beanCidades.buscar(getEstadoSelecionado()); // Estado selecionado que foi setado na linha 01 do formulário
      listCodCid = cidades;
      return listCodCid;
   }
   return null;
}

Espero que seja útil.

Criado 17 de junho de 2010
Ultima resposta 18 de jun. de 2010
Respostas 7
Participantes 4