JSF h:selectiBooleanCheckbox里面的ui:repeat - varStatus.index工作,var没有

时间:2012-06-22 18:54:49

标签: jsf mojarra uirepeat

有人可以解释一下这种现象吗?

我正在使用Mojarra 2.1.6 - Glassfish 3.1.2。

我在ui:repeat内有一个复选框。 ui:repeat循环遍历托管bean中的布尔列表。每个复选框都绑定到该列表的元素。例如:

<ui:repeat var="checkbox" value="#{checkboxTestBean.list}" varStatus="status">
  <h:selectBooleanCheckbox value="#{checkbox}"/>
</ui:repeat>

问题是值未应用于托管bean。当我提交并重新呈现表单时,值不会坚持。

然而,如果我明确地索引到托管bean元素,通过将上面的value=#{checkbox}更改为value="#{checkboxTestBean.list[status.index]}",一切正常。

为什么会出现这种情况?

XHTML:

<h:form>
<div>
Using value="#\{var\}"
<ui:repeat var="checkbox" value="#{checkboxTestBean.list}" varStatus="status">
    <h:selectBooleanCheckbox value="#{checkbox}"/>
</ui:repeat>
</div>

<div>
Using value="#\{varStatus.index\}"
<ui:repeat var="checkbox" value="#{checkboxTestBean.list}" varStatus="status">
    <h:selectBooleanCheckbox value="#{checkboxTestBean.list[status.index]}"/>
</ui:repeat>
</div>
<h:commandLink actionListener="#{checkboxTestBean.actionListener}">
PROCESS FORM
    <f:ajax execute="@form" render="@form"/>
</h:commandLink>
</h:form>

爪哇:

@ManagedBean
@ViewScoped
public class CheckboxTestBean {

public List<Boolean> list = new ArrayList<Boolean>();

public CheckboxTestBean() {
    for (int i = 0; i < 5; i++) {
        list.add(Boolean.FALSE);
    }
}

public void actionListener(ActionEvent evt) {
    System.out.println("*** dumping whole form");
    System.out.println("*** list = " + list);
}

public List<Boolean> getList() {
    return list;
}

public void setList(List<Boolean> list) {
    this.list = list;
}
}

1 个答案:

答案 0 :(得分:4)

那是因为作为不可变类的Boolean没有值的setter方法。当通过索引将其作为列表项引用时,EL将能够通过索引设置List上的新值,如list.add(status.index, newValue)。另一种方法是使其成为可变模型类的属性,并使其具有与List<Item>引用的<h:selectBooleanCheckbox value="#{item.checkbox}"/>类似的集合。

这与Boolean没有特别关系,在List<String>中使用<ui:repeat><h:inputText>时会遇到完全相同的问题。

另见: