commons-collectionsのListUtils.lazyList
昨日書いたNested Propertyなんですけど、Listがダイナミックに作成されるわけで、Strutsはアホなので新しいform beanを作ろうにもlistのサイズなんか知らないんですね。 そこで便利なのが、commons-collections パッケージ[jakarta.apache.org]にあるリストラッパーです。例えばlistのサイズが3で、インデックス7をリクエストしたら、factoryオブジェクトを使って自動的にサイズ7まで増やしてくれるんです。
使い方は簡単。
import org.apache.struts.action.ActionForm;
import org.apache.commons.collections.Factory;
import org.apache.commons.collections.ListUtils;
import izu.beans.NameBean;
import java.util.List;
import java.util.ArrayList;public class NameListForm extends ActionForm implements Factory {
private List nameList;
public NameListForm() {
nameList = ListUtils.lazyList(new ArrayList(), this); ←[訂正]nekopさん、サンキュ!
reset();
}
public void reset() {
nameList.add(new NameBean("Izumi", "Kamitani"));
nameList.add(new NameBean("Nadim", "Bitar"));
nameList.add(new NameBean("First", "Last"));
}
//Factoryクラスから
public Object create() {
return new NameBean();
}
public void setNameList(List nameList) {
this.nameList = nameList;
}
public List getNameList() {
return nameList;
}
public NameBean getName(int index) {
return (NameBean) nameList.get(index);
}
}