iterate タグ内の input タグ(text) から値を取得したい

http://tomcat.jajakarta.org/kvasir/bbs/technical/1195?msg=2#msg4004

遅いレスなので解決済みかもしれませんが。

この部分は以下のHTMLに変換されるはずです。
(valueの値は実際にはxxList[0].getVal().toString()のになります。)

この場合の送信時のフォームBeanへの設定はXxActionFormオブジェクトの
getItem(0).setKey("foo")
を呼び出すのと同じ処理をcommons-beanutilsのBeanUtilsにより
リフレクションを使って行っています。
例外はXxActionFormオブジェクトから取り出したArrayList
空の為に発生します。
xxList.size()の数だけArrayListにBeanオブジェクトが
格納されている必要があります。

回避は
public class XxActionForm extends ActionForm {
private static final int DEFAULT_COUNT = 10;
private ArrayList list = new ArrayList();

public XxActionForm() {
for (int i = 0; i < DEFAULT_COUNT; i++) {
Bean bean = new Bean();
list.add(bean);
}
}

のようにコンストラクタでxxListに格納されるHashtableの数だけ
ArrayListにBeanオブジェクトを格納すれば例外は発生しません。
ですがこのやり方はxxListのサイズが変更される度にそれに合わせて
XxActionFormのリストのBeanの数も調整しなければなりません。

Xx.jspではxxListを使ってフォームに必要な値を取得していますが
通常はフォームBeanの内容をもとにフォームを作成する場合が
多いと思います。
フォームの作成に使ったフォームBeanに値を格納するので送信時に
フォームの内容をフォームBeanに反映させる時に格納するプロパティが
無いというようなエラーは発生しにくいと思います。

フォームBeanの内容でJSPのフォームを作成する場合は
XxActionFormやXx.jspは以下のようになると思います。

public class XxActionForm extends ActionForm {
private ArrayList arrayList = new ArrayList();
public java.util.List getList() {
return arrayList;
}
}





送信

最初の状態ではセッションにフォームBeanは格納されていませんので
xxListを作成してセッションに格納する処理を行った部分で
xxListの代わりにXxActionFormに使って以下のような処理を
行う必要があります。

XxActionForm formBean = new XxActionForm();
List list = formBean.getList();
//必要なだけリストにBeanオブジェクトを作成して加える
Bean bean = new Bean();
bean.setKey("key");
bean.setVal("value");
list.add(bean);
//セッションに格納
session.setAttribute("xxForm", formBean);

リストに格納するBeanオブジェクトの数が固定されている場合には
別の設計になると思います。

    • checkboxを使うときは、ListUtilsのlazyListを使えばリストのサイズが足りなくても自動で増やしてくれる

public class MeisaiListPage extends DomBasePage implements Factory {

interface Session {
public static final String MEISAILIST = "MEISAILIST";
}

private String[] recordChk;
private List meisaiList;

public MeisaiListPage() {
meisaiList = ListUtils.lazyList(new ArrayList(), this);
}

public Object create() {
return new TMeisai();
}