gpt4 book ai didi

jsf - 在JSF中制作多个从属/级联选择组件

转载 作者:行者123 更新时间:2023-12-04 15:24:00 25 4
gpt4 key购买 nike

我试图使4依赖/级联选择组件。在这个问题中,选择组件恰好是<h:selectOneMenu>,但这当然适用于任何其他种类的选择组件,例如<h:selectManyCheckbox><p:selectCheckboxMenu>等。

当用户从第一个菜单中选择一个项目时,第二个菜单将显示相关数据,而当用户从第二个菜单中选择一个项目时,第三个菜单将显示相关数据,依此类推。

用户将仅在第一个菜单上看到项目,其他项目将为空白。如果他在第一个菜单上选择一个项目,则第二个菜单将显示数据,但第三个和第四个菜单将保持空白,依此类推。用户最终必须从所有4个菜单中选择条目。

<h:selectOneMenu id="first" value="#{nodes.selectState"}>
<f:selectItems value="#{nodes.stateList}"/>
<f:ajax render="second">
</h:selectOneMenu>
<h:selectOneMenu id="second" value="#{nodes.selectCity"}>
<f:selectItems value="#{nodes.cityList}"/>
<f:ajax render="third">
</h:selectOneMenu>
<h:selectOneMenu id="third" value="#{nodes.selectRegion"}>
<f:selectItems value="#{nodes.regionList}"/>
<f:ajax render="fourth">
</h:selectOneMenu>
<h:selectOneMenu id="fourth" value="#{nodes.selectStation"}>
<f:selectItems value="#{nodes.stationList}"/>
</h:selectOneMenu>

节点 bean
private String selectState; //+setters, getters
private String selectCity; //+setters, getters
private String selectRegion; //+setters, getters
private String selectStation; //+setters, getters
private List<SelectItem> stateList; //+setters, getters
private List<SelectItem> cityList; //+setters, getters
private List<SelectItem> regionList; //+setters, getters
private List<SelectItem> stationList; //+setters, getters

public getStateList(){
stateList= new ArrayList<SelectItem>();
stateList.add(new SelectItem("A"));
}

public getCityList(){
CityList= new ArrayList<SelectItem>();
if(selectState.equals("A")){
CityList.add(new SelectItem("B"));
}
}

public getRegionList(){
RegionList= new ArrayList<SelectItem>();
if(selectCity.equals("B")){
RegionList.add(new SelectItem("C"));
}
}

public getStationList(){
StationList= new ArrayList<SelectItem>();
if(selectRegion.equals("C")){
StationList.add(new SelectItem("D"));
}
}

仅适用于前两个菜单。其他2个菜单获取 null值。

最佳答案

将bean放入 View 范围,并摆脱getter方法中的任何业务逻辑。

Bean必须放置在 View 范围内,以便记住所有先前的选择和新的可用项目,否则当JSF需要根据先前选择中预先填充的可用项目列表来验证所选项目时,事情将失败。 rendered属性取决于仅在先前请求中设置的条件。

getter方法可能不包含任何业务逻辑,因为它们还将在验证阶段中被调用。您应该使用<f:ajax listener>来基于更改执行业务逻辑。您还应该在监听器方法中明确清除子选择组件的选定值。您可以使用<f:ajax render>更新子选择组件的内容。

因此,这样:

<h:selectOneMenu id="state" value="#{nodes.selectedState}">
<f:selectItem itemValue="#{null}" itemLabel="-- select --" />
<f:selectItems value="#{nodes.availableStates}" />
<f:ajax listener="#{nodes.changeState}" render="city region station" />
</h:selectOneMenu>
<h:selectOneMenu id="city" value="#{nodes.selectedCity}">
<f:selectItem itemValue="#{null}" itemLabel="-- select --" />
<f:selectItems value="#{nodes.availableCities}" />
<f:ajax listener="#{nodes.changeCity}" render="region station" />
</h:selectOneMenu>
<h:selectOneMenu id="region" value="#{nodes.selectedRegion}">
<f:selectItem itemValue="#{null}" itemLabel="-- select --" />
<f:selectItems value="#{nodes.availableRegions}" />
<f:ajax listener="#{nodes.changeRegion}" render="station" />
</h:selectOneMenu>
<h:selectOneMenu id="station" value="#{nodes.selectedStation}">
<f:selectItem itemValue="#{null}" itemLabel="-- select --" />
<f:selectItems value="#{nodes.availableStations}" />
</h:selectOneMenu>


@Named
@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<SelectItem> availableStates; // getter (no setter necessary!)
private List<SelectItem> availableCities; // getter (no setter necessary!)
private List<SelectItem> availableRegions; // getter (no setter necessary!)
private List<SelectItem> 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.
}

也可以看看:
  • How to choose the right bean scope?
  • Best way to add a "nothing selected" option to a selectOneMenu in JSF
  • How to populate options of h:selectOneMenu from database?
  • When to use valueChangeListener or f:ajax listener?
  • Why JSF calls getters multiple times
  • 关于jsf - 在JSF中制作多个从属/级联选择组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16378099/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com