我有一个带有多个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]}
没有做到这一点。
答案 0 :(得分:0)
这个结构应该可以正常工作。确实永远不会被召唤。 JSF / EL只是通过ArrayList
方法调用add(index, object)
本身的setter。即它基本上是这样的:
subscriptionBean.getSelectedCoursedays().add(cd1.sequenceNr, selectedItem);
我不确定你是如何看到“它不起作用”的具体问题。也许您正在触发ajax请求并在setter方法上放置断点并且没有读取服务器日志。有两种可能的情况,这种结构会失败。
如果您没有使用selectedCoursedays
准备new ArrayList()
,那么您将获得PropertyNotFoundException: Target Unreachable, 'selectedCoursedays' returned null
。
如果您没有使用与课程日相同数量的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()];
}
答案 1 :(得分:-1)
c:forEach
和ui:repeat
之间缺乏理解。 c:forEach
无法构建UI component tree nodes
。首先,您必须引用它们之间的区别here。