3

誰かがこの現象を説明できますか?

私はMojarra2.1.6-Glassfish3.1.2を使用しています。

内にチェックボックスがありますui:repeat。はui:repeat、管理対象Beanのブール値のリストをループしています。個々のチェックボックスは、そのリストの要素にバインドされています。例えば:

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

問題は、値がマネージドBeanに適用されていないことです。フォームを送信して再レンダリングすると、値が固定されません。

ただしvalue=#{checkbox}、上記をに変更することにより、マネージドBean要素に明示的にインデックスを付けると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>

Java:

@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;
}
}
4

1 に答える 1

4

これBooleanは、不変クラスである as には値のセッター メソッドがないためです。List代わりにインデックスによるリスト項目として参照する場合、EL はso のように by インデックスに新しい値を設定できますlist.add(status.index, newValue)List<Item>別の方法は、それを変更可能なモデル クラスのプロパティにし、代わりにで参照するようにそのコレクションを持つことです<h:selectBooleanCheckbox value="#{item.checkbox}"/>

これは特に とは関係ありません。BooleanたとえばList<String>で使用すると、まったく同じ問題が発生し<ui:repeat><h:inputText>ます。

以下も参照してください。

于 2012-06-22T18:59:50.903 に答える