1

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

业务:用户想要订阅由多组课程日组成的课程。用户可以选择课程日。因此,如果一门课程由例如 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>

这会产生一个 *m 单选按钮矩阵,我想在其中检索 n 个值。selectItems 的类型为<Long, String>

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

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

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

我尝试使用地图、列表,但它们都不起作用。setSelectedCoursedays 永远不会被调用。如何声明数组/列表/映射以获取支持 bean 中的值?

#{subscriptionBean.selectedCoursedays[cd1.sequenceNr]}

不成功。

4

2 回答 2

0

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

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

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

  1. 如果你不准备selectedCoursedayswith new ArrayList(),那么你会得到PropertyNotFoundException: Target Unreachable, 'selectedCoursedays' returned null

  2. 如果您没有填写selectedCoursedays与课程日相同数量的null项目,那么您将获得一个ArrayIndexOutOfBoundsException

所以,你应该准备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()];
}
于 2012-12-21T13:32:26.440 回答
-1

c:forEach和之间缺少理解ui:repeatc:forEach不会建立UI component tree nodes首先,您必须在此处参考它们之间的差异。

于 2012-12-21T10:25:37.753 回答