使用ui:repeat渲染p:selectOneMenu仅能获取最后一个选中值如何解决
问题根因
所有循环渲染的p:selectOneMenu组件都绑定了#{formFieldsBean.selectedOption}同一个属性,每次循环都会覆盖该属性的绑定关系,表单提交时最后一个下拉框的选中值会把之前的赋值全部覆盖,因此只能拿到最后一个值。
解决方案
步骤1:调整存储结构
有两种可选的存储方式,按需选择:
- 方式一:修改
Field实体类,新增selectedValue属性,用于单独存储每个字段对应的下拉选中值public class Field { // 原有其他属性 private String selectedValue; // 生成getter、setter方法 public String getSelectedValue() { return selectedValue; } public void setSelectedValue(String selectedValue) { this.selectedValue = selectedValue; } } - 方式二:在
formFieldsBean中新增Map结构存储所有下拉的选中值,不需要修改实体类@ViewScoped @Named public class FormFieldsBean { // 原有其他属性 private Map<Long, String> selectedOptionMap = new HashMap<>(); // 生成getter、setter方法 public Map<Long, String> getSelectedOptionMap() { return selectedOptionMap; } public void setSelectedOptionMap(Map<Long, String> selectedOptionMap) { this.selectedOptionMap = selectedOptionMap; } }
注意:formFieldsBean必须使用@ViewScoped作用域,不能用@RequestScoped,避免回发时列表数据重建导致绑定失效
步骤2:修改页面绑定
将p:selectOneMenu的value属性修改为对应每个字段的独立存储位置:
- 若用方式一(实体加属性),修改后的页面代码如下:
<ui:repeat value="#{formFieldsBean.fieldList}" var="field"> <p:panelGrid columns="2" id="grid2" columnClasses="ui-grid-col-5,ui-grid-col-4" layout="grid" styleClass="ui-panelgrid-blank ui-fluid" style="border:0px none; background-color:transparent;"> <p:outputLabel for="@next" value="#{field.question}" rendered="#{field.type == grp.grp}"/> <p:selectOneMenu value="#{field.selectedValue}" rendered="#{field.type == grp.grp}"> <f:selectItem itemLabel="Select One" itemValue="" /> <f:selectItem itemLabel="Yes" itemValue="Yes" /> <f:selectItem itemLabel="No" itemValue="No" /> <f:selectItem itemLabel="NA" itemValue="NA" /> </p:selectOneMenu> </p:panelGrid> </ui:repeat>
提交后直接遍历formFieldsBean.fieldList,读取每个field的selectedValue即可拿到所有选中值。
- 若用方式二(Bean加Map),修改
p:selectOneMenu的value属性为:
<p:selectOneMenu value="#{formFieldsBean.selectedOptionMap[field.id]}" rendered="#{field.type == grp.grp}">
注意:此处field.id是Field实体的唯一主键,确保每个字段的key唯一,提交后读取selectedOptionMap即可拿到所有字段对应的选中值。
内容的提问来源于stack exchange,提问作者Tafadzwa Mashakada
相关产品推荐
相关产品推荐

