editableBaseSetList
がint[]の場合、はbaseNumber
intです。これで、入力テキストコンポーネントをこのintにバインドしています。
ただし、このバインディングは双方向ではありません。input要素は、バインドしている要素のみを表示し、元のコレクションは表示しません。したがって、このコレクションを更新する方法についての知識はありません。
したがって、更新可能なものにバインドする必要があります。たとえば、リストに内部整数のゲッターとセッター(getInt()やsetInt()など)を含むIntHolderが含まれていて、リストがArrayListになる場合は、次のように使用します。
<ui:repeat value="#{drawsetController.selected.editableBaseSetList}" var="baseNumber">
<h:inputText value="#{baseNumber.int}"/>
</ui:repeat>
ポストバックの後、JSFは、指定された値を使用して、リスト内の各IntHolderでsetInt()メソッドを呼び出します。
整数または他の不変の型をすでに保持しているコレクションの場合、それを上記のようなコレクションに変換するのは少し面倒な場合があります。ただし、別の解決策もあります。そこでは、のvar
属性を使用せずui:repeat
、そのインデックスを使用します。次に、h:inputText
このインデックス変数によってインデックス付けされたコレクションへのバインディングを指定します。
例えば
次のBeanがあるとします。
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class RepeatBean {
List<Integer> list;
public List<Integer> getList() {
return list;
}
@PostConstruct
public void initList() {
list = new ArrayList<Integer>();
list.add(10);
list.add(20);
list.add(30);
}
public String save() {
// list now contains the values provided by the user.
return "";
}
}
次のFaceletで使用されます。
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<h:body>
<h:form>
<ui:repeat value="#{repeatBean.list}" varStatus="status">
<h:inputText value="#{repeatBean.list[status.index]}" />
</ui:repeat>
<h:commandButton value="Save" action="#{repeatBean.save}" />
</h:form>
</h:body>
</html>
これにより、最初は画面に102030が表示されます。番号を変更して[保存]をクリックすると、たとえばブレークポイントを介して、リストインスタンス変数に更新された番号が含まれていることを確認できます。