Faça várias listas suspensas selectOneMenu dependentes / em cascata no JSF

Eu estou tentando fazer 4 menus dependentes.

Quando o usuário escolhe um item do primeiro menu, o segundo menu mostra os dados dependentes e quando o usuário escolhe o item do segundo, o terceiro mostrará os dados dependentes e assim por diante.

O usuário verá itens apenas no primeiro menu e os outros estarão em branco. Se ele escolher um item no primeiro menu, o segundo mostrará os dados, mas o terceiro e o quarto permanecerão em branco, e assim por diante. O usuário deve, eventualmente, escolher inputs de todos os 4 menus.

               

nós da class Java

 private String selectState; //+setters, getters private String selectCity; //+setters, getters private String selectRegion; //+setters, getters private String selectStation; //+setters, getters private List stateList; //+setters, getters private List cityList; //+setters, getters private List regionList; //+setters, getters private List stationList; //+setters, getters public getStateList(){ stateList= new ArrayList(); stateList.add(new SelectItem("A")); } public getCityList(){ CityList= new ArrayList(); if(selectState.equals("A")){ CityList.add(new SelectItem("B")); } } public getRegionList(){ RegionList= new ArrayList(); if(selectCity.equals("B")){ RegionList.add(new SelectItem("C")); } } public getStationList(){ StationList= new ArrayList(); if(selectRegion.equals("C")){ StationList.add(new SelectItem("D")); } } 

está funcionando apenas nos 2 primeiros menus, os outros 2 menus recebem valores nulos

Coloque o bean no escopo da view e livre-se de qualquer lógica de negócios nos methods getter.

O bean deve ser colocado no escopo da visão para que todas as seleções anteriores e novos itens disponíveis sejam lembrados, caso contrário, as coisas falharão se, por exemplo, o atributo rendered depender de uma condição que foi definida apenas em uma solicitação anterior ou se o JSF precisar validar a seleção item na lista de itens disponíveis.

Os methods getter não devem conter nenhuma lógica de negócios, pois eles também serão invocados durante a fase de validação. Você deve usar o para executar a lógica de negócios com base em uma alteração. Você deve, no método de ouvinte, limpar explicitamente os valores selecionados de listas suspensas de filhos. Você pode usar o para atualizar o conteúdo das listas suspensas filho.

Assim, então:

                    

com

 @ManagedBean @ViewScoped public class Nodes { private String selectedState; // getter+setter private String selectedCity; // getter+setter private String selectedRegion; // getter+setter private String selectedStation; // getter+setter private List availableStates; // getter (no setter necessary!) private List availableCities; // getter (no setter necessary!) private List availableRegions; // getter (no setter necessary!) private List availableStations; // getter (no setter necessary!) @EJB private SomeService someService; @PostConstruct public void init() { availableStates = someService.listStates(); } public void changeState(AjaxBehaviorEvent event) { availableCities = someService.listCities(selectedState); selectedCity = selectedRegion = selectedStation = null; availableRegions = availableStations = null; } public void changeCity(AjaxBehaviorEvent event) { availableRegions = someService.listRegions(selectedCity); selectedRegion = selectedStation = null; availableStations = null; } public void changeRegion(AjaxBehaviorEvent event) { availableStations = someService.listStations(selectedRegion); selectedStation = null; } // Generate necessary getters+setters here. You should not change them. } 

Veja também:

  • Como escolher o escopo correto do bean?
  • Melhor maneira de adicionar uma opção “nada selecionado” a um selectOneMenu no JSF
  • Como preencher as opções de h: selectOneMenu do database?
  • Quando usar valueChangeListener ou f: ajax listener?
  • Por que o JSF chama getters várias vezes

Existe um erro de digitação no seu código. Para o terceiro menu, você deu o nome do id como “primeiro” em vez de “terceiro”. Pode ser por causa desse problema.

Tente isso, pode ajudá-lo

Usando o –Selecione City–, –Selecione Region–, –Selecione Station– para evitar o ponteiro nulo Exception.

  public getStateList(){ stateList= new ArrayList(); stateList.add(new SelectItem("A")); } public getCityList(){ CityList= new ArrayList(); if(selectState.equals("A")) { CityList.add(new SelectItem("B")); } else { CityList.add(new SelectItem("--Select City--")); selectCity = "--Select City--"; } public getRegionList(){ RegionList= new ArrayList(); if(selectCity.equals("B")) { RegionList.add(new SelectItem("C")); } else { RegionList.add(new SelectItem("--Select Region--")); selectRegion = "--Select Region--"; } } public getStationList(){ StationList= new ArrayList(); if(selectRegion.equals("C")) { StationList.add(new SelectItem("D")); } else { StationList.add(new SelectItem("Select Station")); selectStation = "--Select Station--"; } } 

Você está enfrentando esse problema porque você tem duas id="first" . Corrigir isso e isso deve funcionar.