JSF页面上的多组selectOneRadio:如何恢复值?

JSF页面上的多组selectOneRadio:如何恢复值?,jsf,selectoneradio,Jsf,Selectoneradio,我有一个jsf页面,上面有多个radiobutton组(动态生成)。我需要在一个支持bean中从中检索值,但未能这样做 业务:用户希望订阅由多组coursedays组成的课程。用户可以选择coursedays。因此,如果一个课程由例如4个课程日组成,分为3个不同的组,那么用户可以从12个课程日中选择3个模块 xhtml页面的相关部分: <c:forEach var="cd1" items="#{coursedayBean.getCoursedays(groupBean.getFirstGr

我有一个jsf页面,上面有多个radiobutton组(动态生成)。我需要在一个支持bean中从中检索值,但未能这样做

业务:用户希望订阅由多组coursedays组成的课程。用户可以选择coursedays。因此,如果一个课程由例如4个课程日组成,分为3个不同的组,那么用户可以从12个课程日中选择3个模块

xhtml页面的相关部分:

<c:forEach var="cd1" items="#{coursedayBean.getCoursedays(groupBean.getFirstGroup}">
  <h:selectOneRadio value="#{subscriptionBean.selectedCoursedays[cd1.sequenceNr]}" >
    <f:selectItems value="#{coursedayBean.getCoursedaysSelectItems}"/>
  </h:selectOneRadio>
</c:forEach>

不起作用。

这是
c:forEach
ui:repeat
之间的误解
c:forEach
不会构建
UI组件树节点
。首先,您必须引用它们之间的差异。

此构造应该可以正常工作。二传手确实永远不会被召唤。JSF/EL只是通过
add(index,object)
方法调用
ArrayList
本身上的setter。也就是说,它基本上:

subscriptionBean.getSelectedCoursedays().add(cd1.sequenceNr, selectedItem);
我不确定你是如何观察到“它不起作用”这一具体问题的。也许您触发了一个ajax请求,并在setter方法上设置了一个断点,但没有读取服务器日志。此构造有两种可能失败的情况

  • 如果不使用
    new ArrayList()
    准备
    selectedCoursedays
    ,则会得到
    PropertyNotFoundException:Target Unreachable,“selectedCoursedays”返回null

  • 如果您在
    selectedCoursedays
    中填写的
    null
    项目数量与课程天数相同,则您将获得
    ArrayIndexOutOfBoundsException

  • 因此,您应该准备
    selectedCoursedays
    ,如下所示:

    @PostConstruct
    public void init() {
        selectedCoursedays = new ArrayList<String>();
        for (int i = 0; i < coursedays.size(); i++) {
            selectedCoursedays.add(null);
        }
    }
    

    谢谢,这就是原因。这个答案不正确。这不可能是原因。“不会构建UI组件树节点”的解释仅适用于
    ,而
    肯定会构建它们(
    只呈现它们),但这绝对不是原因所在。
    subscriptionBean.getSelectedCoursedays().add(cd1.sequenceNr, selectedItem);
    
    @PostConstruct
    public void init() {
        selectedCoursedays = new ArrayList<String>();
        for (int i = 0; i < coursedays.size(); i++) {
            selectedCoursedays.add(null);
        }
    }
    
    private String[] selectedCoursedays;
    
    @PostConstruct
    public void init() {
        selectedCoursedays = new String[coursedays.size()];
    }