JSF:如果选定项的呈现是动态的,如何从selectOneMenu中获取选定项?

JSF:如果选定项的呈现是动态的,如何从selectOneMenu中获取选定项?,jsf,Jsf,在我看来,我有两个菜单,我想使依赖,即,如果第一个菜单持有值“渲染第二菜单”和“不渲染第二菜单”,我想第二个菜单渲染只有当用户选择“渲染第二菜单”选项在第一个菜单。在第二个菜单与第一个菜单呈现在同一页面后,用户必须从中选择当前项,填充其他字段并提交表单以将值存储在数据库中。这两个选项列表都是静态的,它们从数据库中获取一次并保持不变。我的问题是,我总是从第二个菜单中获取null作为所选项的值。如何获得合适的值?包含有问题元素的示例视图代码为: <h:selectOneMenu id="ren

在我看来,我有两个菜单,我想使依赖,即,如果第一个菜单持有值“渲染第二菜单”和“不渲染第二菜单”,我想第二个菜单渲染只有当用户选择“渲染第二菜单”选项在第一个菜单。在第二个菜单与第一个菜单呈现在同一页面后,用户必须从中选择当前项,填充其他字段并提交表单以将值存储在数据库中。这两个选项列表都是静态的,它们从数据库中获取一次并保持不变。我的问题是,我总是从第二个菜单中获取null作为所选项的值。如何获得合适的值?包含有问题元素的示例视图代码为:

<h:selectOneMenu id="renderSecond" value="#{Bean.renderSecondValue}"
                                 valueChangeListener="#{Bean.updateDependentMenus}"
                                 immediate="true"
                                 onchange="this.form.submit();" >
                    <f:selectItems value="#{Bean.typesOfRendering}" />
                </h:selectOneMenu><br />

<h:selectOneMenu id="iWillReturnYouZeroAnyway" value="#{Bean.currentItem}"
                                 rendered="#{Bean.rendered}" >
                    <f:selectItems value="#{Bean.items}" />
                </h:selectOneMenu><br />
<h:commandButton action="#{Bean.store}" value="#Store" />

只有当我们将“不渲染”作为第一选项时,问题才会出现。我决定更改数据库中的值,现在我将“渲染第二个菜单”作为第一个菜单。使用这种方法,一切正常。

如果在
UIInput
UICommand
组件上使用
rendered
属性,则必须确保
rendered
条件在后续请求中的计算方式完全相同(在提交表单期间)与初始请求期间(显示表单期间)相同。当它的计算结果为false时,将不会应用/验证请求值,也不会更新模型值,并且不会为相关组件调用任何操作


一个简单的修复方法是将bean放入会话范围,但这也有一些警告(在多个浏览器选项卡/窗口中打开同一页面时,用户体验不佳)。在JSF2.0上,您可以使用视图范围。在JSF1.x上,您可以使用Tomahawk的
t:saveState

是的,这也是我所想的。但是,我不知道视图范围。谢谢
public void updateDependentMenus(ValueChangeEvent value) {
    String newValue = (String) value.getNewValue();
        if ("render second menu" == newValue){
            isRendered = true;
        } else {
            isRendered = false;
        }
}

public String store(){
    System.out.println(currentItem);
    return "stored";
}