ui中的输入组件:重复,如何保存提交的值

时间:2015-01-20 20:18:39

标签: jsf input uirepeat

我正在显示数据库中的问题列表,对于每个问题,我必须显示一个选项列表,在本例中为单选按钮。

<ui:repeat value="#{formData.questions}" var="question">
    <div>
        <p:outputLabel value="#{question.name}" />
        <p:selectOneRadio value="#{formData.selectedOption}">
            <f:selectItems value="#{formData.options}" />
        </p:selectOneRadio>
    </div>
</ui:repeat>

我需要为每个问题保存选中的选项。

我该怎么做?

1 个答案:

答案 0 :(得分:5)

您需要以某种方式将输入值与重复变量var相关联。现在你没有在任何地方这样做,基本上将所有输入值绑定到同一个bean属性。因此,当表单被提交时,每次迭代都将使用当前迭代轮的值每次覆盖bean属性,直到最终获得最后一次迭代的值为止。这绝对不对。

最简单的方法是将其与var所代表的对象直接关联:

<p:selectOneRadio value="#{question.selectedOption}">

在您的具体情况下,这只会将“问题”模型与“答案”模型紧密联系在一起。将它们分开是合理的。在您的特定情况下,更合适的解决方案是将其与当前迭代的#{question}作为关键字进行映射(前提是它具有正确的equals()hashCode()实现,显然):

<p:selectOneRadio value="#{formData.selectedOptions[question]}">

使用:

private Map<Question, String> selectedOptions = new HashMap<>();

无论采用何种方法,在动作方法中,只需迭代它就可以全部收集它们。