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