【问题标题】:JSF multiple groups of selectOneRadio on a page: how to recover the values?页面上的 JSF 多组 selectOneRadio:如何恢复值?
【发布时间】:2012-12-08 19:28:30
【问题描述】:

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

企业:用户想要订阅由多组课程日组成的课程。用户可以选择课程日。因此,如果一门课程由例如 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 单选按钮矩阵,我想在其中检索 n 个值。 selectItem 的类型为 &lt;Long, String&gt;

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

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

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

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

#{subscriptionBean.selectedCoursedays[cd1.sequenceNr]}

没用。

【问题讨论】:

    标签: jsf selectoneradio


    【解决方案1】:

    c:forEachui:repeat 之间是缺少了解。 c:forEach 不会构建 UI component tree nodes。首先,您必须参考它们之间的差异here

    【讨论】:

    • 谢谢,原来是这个原因。
    • 这个答案不正确。这不可能是原因。 “不会构建 UI 组件树节点”的解释仅适用于 &lt;ui:repeat&gt;&lt;c:forEach&gt; 肯定会构建它们(&lt;ui:repeat&gt; 只会渲染它们),但这绝对不是原因。
    【解决方案2】:

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

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

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

    1. 如果你不准备selectedCoursedaysnew 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()];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 2017-06-29
      • 2014-01-06
      • 2012-11-22
      • 2011-07-23
      • 1970-01-01
      相关资源
      最近更新 更多