Duvida com Solucao para Preencher "SELECT" apartir do valor de um outro SELECT + JSF

7 respostas
sudeval

Olá pessoal,
como vocês implementam utilizando JSF , quando se deparam com a necessidade de ao Selecionar uma opção de um SELECT um outro select seja preenchido de acordo com tal seleção ?

um exemplo seria:

[ PAISES ]

[ESTADO]

[CIDADES]

onde ao selecionar um paises o SELECT de estado fosse carregado com os estados desse país e o mesmo fosse ocorrer com cidades quando estado fosse selecionado. ( isso é apenas um exemplo, no meu caso eu irei precisar somente de 2 estágios desses )

desculpa pela pergunta boba, é que estou praticamente iniciando com o JSF e WEB…

t+

7 Respostas

Javabuntu

cara eu uso RichFaces e Ajax4JSF e isso fica muito simples, eu faço uma comboBox com os valores puxados do banco…e a segunda fica invisível…dai quando seleciono a primeira eu seto uma propriedade no backing Bean do valor…e dou um reRender(tag do ajax4JSF) no segundo comboBox e ele atualiza mostando o valor…

qual implementação do JSF vc está usando…

sudeval

mojarra

( entendi a ideia, teria algum exemplo e talz ? - pode ser algum site… )

rollei

vou aproveitar o topico para fazer uma pergunta.

eu queria fazer uma aplicacao parecida, mas nao eh exatamente igual … o que eu queria fazer eh o seguinte:

vai ter uma opcao para selecionar a data, depois que a data for selecionada, deve aparecer uma lista (select) ou ele deve estar desabilitado e depois que a data for selecionada ele deve ficar ativo … ate tudo igual. depois que o usuario clicar em cima de qualquer nome desse select o nome escolhido no select deve sumir da selecao e aparecer em outro lugar da pagina ± assim:

nomeDoSelect (nao editavel) e do lado uma entrada para colocar a hora

deu para entender ±? toda vez que o usuario clicar em cima de um nome ele vai adicionar uma linha com a opcao de entrada de hora (que no caso vai ser obrigatorio) … essa linha deve poder se excluida e quando for o nome que esta na linha deve voltar para o select

vai ficar varios nome com suas respectivas datas e horas, acumulando e lah em baixo vai ter um botao de enviar, quando o usuario jah tiver adcionado todos os nomes ele vai poder salvar no banco o que ele fez.

espero que tenha sido claro. e ai? dicas. que vou usar para fazer o que quero? algum exemplo que alguem possa me dar??

Javabuntu

sudeval:

( entendi a ideia, teria algum exemplo e talz ? - pode ser algum site… )

quais bibliotecas JSF vc está usando… eu uso RichFaces e Ajax4JSf e tem recursos fáceis pra isso…

agora dependende de qual vc usar pra te indicar o esquema mais fácil…

RichFaces, IceFaces, MyFaces…etc…

sudeval

Opa, desculpa a demora…
mas atualmente não estou usando nenhuma das bibliotecas de componentes não, ( por conta de ainda não precisar no projeto mesmo, nada contra… é provavel que logo venha a usar Richfaces )

Na verdade eu cheguei a fazer esse probleminha que eu queria, mas cheguei a um outro problema que deve ser bobo.

Tipo, como citei eu tenho 2 SELECT e os dados do 2o depende do valor selecionado do 1o.

[CIDADE]
[UNIDADES4CIDADE]

no .jsp eu fiz:

<f:view>
  <h:form>
    <p>
    <h:outputLabel for="cidade" value="Selecione a Cidade:"/>
    <br>
    <h:selectOneMenu id="cidade" value="#{sdeBean.cidade}" immediate="true" valueChangeListener="#{sdeBean.atualizarUnidadeOperacional}" onchange="submit()" >
      <f:selectItems value="#{sdeBean.listaCidades}"/>
    </h:selectOneMenu>
    </p>
    <p>
    <h:outputLabel for="unidade" value="Selecione a Unidade Operacional:"/>
    <br>
    <h:selectOneMenu id="unidade" value="#{sdeBean.unidade}">
      <f:selectItems value="#{sdeBean.listaUnidades}"/>						
    </h:selectOneMenu>
    </p>
    <p>
    <h:commandButton action="#{sdeBean.gerarRelatorioEstatistico}" value="Consultar"/>
    </p>
  </h:form>
</f:view>

no meu Bean, eu faço:

// GET e SET
public int getCidade() {
  return cidade;
}

public void setCidade(int cidade) {
  this.cidade = cidade;
}
	
public int getUnidade() {
  return unidade;
}
	
public void setUnidade(int unidade) {
  this.unidade = unidade;
}


// CIDADES
public List<SelectItem> getListaCidades() {
  listaCidades = obterListaCidades();
  return listaCidades;
}
	
public void setListaCidades(List<SelectItem> listaCidades) {
  this.listaCidades = listaCidades;
}
	
// UNIDADES
public List<SelectItem> getListaUnidades() {
  listaUnidades = obterUnidadesOperacional(cidade);
  return listaUnidades;
}
	
public void setListaUnidades(List<SelectItem> listaUnidades) {		
  this.listaUnidades = listaUnidades;
}


// TRATAR O EVENTO DE CIDADE
public void atualizarUnidadeOperacional(ValueChangeEvent event) {

  UISelectOne select = (UISelectOne)event.getSource();  
  Integer cdCidade = (Integer) select.getValue();
  List<SelectItem> list = obterUnidadesOperacional(cdCidade);
  setListaUnidades(list);
}


// OBTER AS CIDADES
private List<SelectItem> obterListaCidades() {
		BizCidadeSDE bizCidade = new BizCidadeSDE();
		List<Hashtable> cidadesH = bizCidade.obterCidadesSDE(CDADMIN_DEFAULT);
		List<SelectItem> list = new ArrayList<SelectItem>();
		
		// Aqui eu Inicializo a 1a Cidade, do esse nome... é como se fosse um TODAS
		SelectItem itemRegional = new SelectItem();
		itemRegional.setValue(0);
		itemRegional.setLabel("REGIONAL");
		list.add(itemRegional);
		
		for (Hashtable hashtableCidade : cidadesH) {
			// obtendo os valores
			Integer id = (Integer) hashtableCidade.get("codigoCidade");
			String nome = (String) hashtableCidade.get("nome");
			
			// criando um item
			SelectItem item = new SelectItem();
			item.setValue(id);
			item.setLabel(nome);
			
			// adicionando a lista
			list.add(item);
		}
		
		return list;
	}

// OBTER AS UNIDADES
private List<SelectItem> obterUnidadesOperacional(Integer cdCidade) {
		List<SelectItem> lista = new ArrayList<SelectItem>();
		Hashtable<Integer,List<Hashtable>> unidadesPorCidade = obterUnidadeOperacionalPorCidade();
		List<Hashtable> unidades = unidadesPorCidade.get(cdCidade);
		
		// CHECAR SE É REGIONAL
		if (new Integer(0).equals(cdCidade)) {
			SelectItem item = new SelectItem();
			item.setValue(0);
			item.setLabel("Todas");
			lista.add(item);
		}	// NÃO POSSUI UNIDADES
		else if (unidades == null) {
			SelectItem itemEmpty = new SelectItem();
			itemEmpty.setValue(0);
			itemEmpty.setLabel("Não Possui Unidade Operacional");
			lista.add(itemEmpty);
		}  // PREENCHER AS UNIDADES 
		else {			
			for(Hashtable h : unidades) {
				Integer id = (Integer)h.get("codigoUnidadeOperacional");
				String nome = (String)h.get("nome");
				
				SelectItem item = new SelectItem();
				item.setValue(id);
				item.setLabel(nome);
				lista.add(item);
			}
		}			
		return lista;
	}


public String gerarRelatorioEstatistico() {
   // METODOS DE GERAR O RELATORIO....
}

O galho é o Seguinte, a ação de eu selecionar a cidade e ele trazer as Unidades da mesma no outro combo ta acontecendo… , mas tem algo estranho, tipo, ao entrar ná página ele me daria os seguintes parametros selecionados

[REGIONAL]
[TODAS]

=>CONSULTAR

da forma que está ae se eu não alterar nenhum dos parametros ele vai e faz o relatório normalmente após clicar no CONSULTAR.

caso eu venha a alterar algum dos parametros

[FORTALEZA]
[UNIDADE 05]

=>CONSULTAR

quando eu clico em CONSULTAR, ele faz o que eu não consigo entender… ele não vai executar o relatório ( metodo gerarRelatorioEstatistico )
mas troca o meu parametro de UNIDADE para o valor TODOS
no caso do meu exemplo ele faria

[FORTALEZA]
[TODOS]

=>CONSULTAR

alguém sabe o que pode ser ?

sudeval

resolvi essa questão aqui, na verdade o valor selecionado de cidade no meu bean se perdia ( creio eu no momento do submit) e quando ia tentar selecionar as unidades por cidade (como o int inicializa com 0) sempre estava me trazendo o SelectItem com o valor la “TODOS”…
alterei o meu scopo para session , e passei a user o proprio int (cidade) do meu bean como parametro para o list de Unidades… e resolveu !
obrigado a todos.!

murilo_scool

acrescentando…

http://serjaum.wordpress.com/2009/08/28/jsf-tutorial-combos-aninhados-estadoscidades/

Criado 24 de março de 2008
Ultima resposta 30 de nov. de 2010
Respostas 7
Participantes 4