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

时间:2012-12-21 08:03:23

标签: jsf selectoneradio

我有一个带有多个radiobutton组(动态生成)的jsf页面。我需要从支持bean中检索它的值,但是没有这样做。

业务:用户想要订阅由多组coursedays组成的课程。用户可以选择coursedays。因此,如果一门课程包括4个课程,由3个不同的小组组成,用户可以选择12个课程,以3个为一组。

xhtml-page的相关部分:

<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>

这导致n * m的radiobuttons矩阵,我想要检索n个值。 selectItems的类型为<Long, String>

在我的支持bean中,我声明了以下内容:

public List<String> getSelectedCoursedays() {
  return selectedCoursedays;
}

public void setSelectedCoursedays(List<String> selectedCoursedays) {
  this.selectedCoursedays = selectedCoursedays;
}

我尝试使用Map,List,但没有一个工作。永远不会调用setSelectedCoursedays。 如何声明数组/列表/映射以获取我的支持bean中的值?

#{subscriptionBean.selectedCoursedays[cd1.sequenceNr]}

没有做到这一点。

2 个答案:

答案 0 :(得分:0)

这个结构应该可以正常工作。确实永远不会被召唤。 JSF / EL只是通过ArrayList方法调用add(index, object)本身的setter。即它基本上是这样的:

subscriptionBean.getSelectedCoursedays().add(cd1.sequenceNr, selectedItem);

我不确定你是如何看到“它不起作用”的具体问题。也许您正在触发ajax请求并在setter方法上放置断点并且没有读取服务器日志。有两种可能的情况,这种结构会失败。

  1. 如果您没有使用selectedCoursedays准备new ArrayList(),那么您将获得PropertyNotFoundException: Target Unreachable, 'selectedCoursedays' returned null

  2. 如果您没有使用与课程日相同数量的selectedCoursedays项填充null,那么您将获得ArrayIndexOutOfBoundsException

  3. 因此,您应该按如下方式准备selectedCoursedays

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

    更简单的替代方法是将其设为String[]

    private String[] selectedCoursedays;
    
    @PostConstruct
    public void init() {
        selectedCoursedays = new String[coursedays.size()];
    }
    

答案 1 :(得分:-1)

c:forEachui:repeat之间缺乏理解。 c:forEach无法构建UI component tree nodes。首先,您必须引用它们之间的区别here