Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 如何管理下拉列表之间的依赖关系?_Jsf_Jsf 2 - Fatal编程技术网

Jsf 如何管理下拉列表之间的依赖关系?

Jsf 如何管理下拉列表之间的依赖关系?,jsf,jsf-2,Jsf,Jsf 2,我正在使用JSF2.0。我有三个下拉列表: 主下拉菜单 儿童跌打 儿童下拉菜单 需要强制执行的业务规则是: 每当masterDropDown更改时,我需要填充childDropDownA和childDropDownB childDropDownA和childDropDownB的内容相同,只是当用户从childDropDownA中选择某个内容时,childDropDownB应该有其旧内容,但用户在childDropDownA中选择的内容除外。当用户首先选择childDropDownB时,同样的规则

我正在使用JSF2.0。我有三个下拉列表:

  • 主下拉菜单
  • 儿童跌打
  • 儿童下拉菜单
  • 需要强制执行的业务规则是:

  • 每当masterDropDown更改时,我需要填充childDropDownA和childDropDownB
  • childDropDownA和childDropDownB的内容相同,只是当用户从childDropDownA中选择某个内容时,childDropDownB应该有其旧内容,但用户在childDropDownA中选择的内容除外。当用户首先选择childDropDownB时,同样的规则也适用
  • 在JSF中实现这一点最干净的方法是什么?

    普通JSF 2:

    
    
    豆角

    @ManagedBean
    @ViewScoped
    public class Bean {
        private Map<String, String> ddlMasterData;
        private Map<String, String> ddlChildAData;
        private Map<String, String> ddlChildBData;
        private String ddlMasterSelected;
        private String ddlChildASelected;
        private String ddlChildBSelected;
    
        @PostConstruct
        public void init() {
            //fill initial values for the drop down lists...
            //this is a raw idea, you must refine it
            DDLService ddlService = new DDLService();
            ddlMasterData = ddlService.getDDLMasterData();
            //empty data for children ddls
            ddlChildAData = new LinkedHashMap<String, String>();
            ddlChildBData = new LinkedHashMap<String, String>();
        }
    
        public void refillChildB(AjaxBehaviorEvent event) {
            //filling the children ddls
            DDLService ddlService = new DDLService();
            ddlChildASelected = ddlService.getDDLChildData();
            //same method to fill child data on ddlChildBSelected  because is same data
            ddlChildBSelected = ddlService.getDDLChildData();
        }
    
        public void fillChildren(AjaxBehaviorEvent event) {
            //when the user selects something from childDropDownA
            //childDropDownB should have its old contents
            //I assume it must be cleared, you can change this behavior though
            ddlChildBData = new LinkedHashMap<String, String>();
        }
    
        public void refillChildA(AjaxBehaviorEvent event) {
            //The same rule applies when the user selects childDropDownB first
            //I assume it must be cleared, you can change this behavior though
            ddlChildAData = new LinkedHashMap<String, String>();
        }
    }
    
    @ManagedBean
    @视域
    公共类Bean{
    私有地图数据;
    私有地图;
    私有地图数据;
    选择私有字符串;
    已选择私有字符串ddlChildASelected;
    选择私有字符串;
    @施工后
    公共void init(){
    //填写下拉列表的初始值。。。
    //这是一个原始的想法,你必须改进它
    DDLService DDLService=新的DDLService();
    ddlMasterData=ddlService.getDDLMasterData();
    //子DDL的空数据
    ddlChildAData=新建LinkedHashMap();
    ddlChildBData=新建LinkedHashMap();
    }
    公共无效重新填充儿童B(AjaxBehaviorEvent事件){
    //给孩子们填饱肚子
    DDLService DDLService=新的DDLService();
    ddlChildASelected=ddlService.getDDLChildData();
    //填充ddlChildBSelected上的子数据的方法相同,因为是相同的数据
    ddlChildBSelected=ddlService.getDDLChildData();
    }
    公共无效填充子项(AjaxBehaviorEvent事件){
    //当用户从childDropDownA中选择某个内容时
    //childDropDownB应该有它的旧内容
    //我认为它必须被清除,但你可以改变这种行为
    ddlChildBData=新建LinkedHashMap();
    }
    公共无效再填充儿童(AjaxBehaviorEvent事件){
    //当用户首先选择childDropDownB时,同样的规则也适用
    //我认为它必须被清除,但你可以改变这种行为
    ddlChildAData=新建LinkedHashMap();
    }
    }
    
    普通JSF 2:

    
    
    豆角

    @ManagedBean
    @ViewScoped
    public class Bean {
        private Map<String, String> ddlMasterData;
        private Map<String, String> ddlChildAData;
        private Map<String, String> ddlChildBData;
        private String ddlMasterSelected;
        private String ddlChildASelected;
        private String ddlChildBSelected;
    
        @PostConstruct
        public void init() {
            //fill initial values for the drop down lists...
            //this is a raw idea, you must refine it
            DDLService ddlService = new DDLService();
            ddlMasterData = ddlService.getDDLMasterData();
            //empty data for children ddls
            ddlChildAData = new LinkedHashMap<String, String>();
            ddlChildBData = new LinkedHashMap<String, String>();
        }
    
        public void refillChildB(AjaxBehaviorEvent event) {
            //filling the children ddls
            DDLService ddlService = new DDLService();
            ddlChildASelected = ddlService.getDDLChildData();
            //same method to fill child data on ddlChildBSelected  because is same data
            ddlChildBSelected = ddlService.getDDLChildData();
        }
    
        public void fillChildren(AjaxBehaviorEvent event) {
            //when the user selects something from childDropDownA
            //childDropDownB should have its old contents
            //I assume it must be cleared, you can change this behavior though
            ddlChildBData = new LinkedHashMap<String, String>();
        }
    
        public void refillChildA(AjaxBehaviorEvent event) {
            //The same rule applies when the user selects childDropDownB first
            //I assume it must be cleared, you can change this behavior though
            ddlChildAData = new LinkedHashMap<String, String>();
        }
    }
    
    @ManagedBean
    @视域
    公共类Bean{
    私有地图数据;
    私有地图;
    私有地图数据;
    选择私有字符串;
    已选择私有字符串ddlChildASelected;
    选择私有字符串;
    @施工后
    公共void init(){
    //填写下拉列表的初始值。。。
    //这是一个原始的想法,你必须改进它
    DDLService DDLService=新的DDLService();
    ddlMasterData=ddlService.getDDLMasterData();
    //子DDL的空数据
    ddlChildAData=新建LinkedHashMap();
    ddlChildBData=新建LinkedHashMap();
    }
    公共无效重新填充儿童B(AjaxBehaviorEvent事件){
    //给孩子们填饱肚子
    DDLService DDLService=新的DDLService();
    ddlChildASelected=ddlService.getDDLChildData();
    //填充ddlChildBSelected上的子数据的方法相同,因为是相同的数据
    ddlChildBSelected=ddlService.getDDLChildData();
    }
    公共无效填充子项(AjaxBehaviorEvent事件){
    //当用户从childDropDownA中选择某个内容时
    //childDropDownB应该有它的旧内容
    //我认为它必须被清除,但你可以改变这种行为
    ddlChildBData=新建LinkedHashMap();
    }
    公共无效再填充儿童(AjaxBehaviorEvent事件){
    //当用户首先选择childDropDownB时,同样的规则也适用
    //我认为它必须被清除,但你可以改变这种行为
    ddlChildAData=新建LinkedHashMap();
    }
    }
    
    呈现属性在
    中起什么作用?@Inquisitive它将更新
    ddlChildA
    组件的内容,您应该在ajax调用完成时提供要更新的组件的id。@好奇您可以找到有关
    的更多信息,以及您为什么选择
    LinkedHashMap
    而不是普通的
    HashMap
    作为此处的数据结构?@好奇,因为它维护了元素添加到映射中的顺序。更多信息:。请注意,
    HashMap
    只会在映射中添加项目,但您不能确定其顺序。
    中的render属性起什么作用?@Inquisitive它将更新
    ddlChildA
    组件的内容,您应该在ajax调用完成时提供要更新的组件的id。@好奇您可以找到有关
    的更多信息,以及您为什么选择
    LinkedHashMap
    而不是普通的
    HashMap
    作为此处的数据结构?@好奇,因为它维护了元素添加到映射中的顺序。更多信息:。请注意,
    HashMap
    只会在映射中添加项目,但您无法确定其顺序。