まず、以下のようなフォームを準備する。
----------------------------------------------------
public class SampleForm extends ValidatorForm {
private String sampleSingleValue;
private List<SampleBean> sampleList;
public List<SampleBean> getSampleList() {
public void setSampleList(List<SampleBean> sampleList) {
public String getSampleSingleValue() {
public void setSampleSingleValue(String sampleSingleValue) {
}private List<SampleBean> sampleList;
public List<SampleBean> getSampleList() {
return sampleList;
}public void setSampleList(List<SampleBean> sampleList) {
this.sampleList = sampleList;
}public String getSampleSingleValue() {
return sampleSingleValue;
}public void setSampleSingleValue(String sampleSingleValue) {
this.sampleSingleValue = sampleSingleValue;
}----------------------------------------------------
JSP側では通常、イテレータを使わない個所では、
以下の書き方でテキストボックスの値の設定と取得が可能。
(bean:defineを使わない方法もあるはずなので改善の余地あり)
----------------------------------------------------
<bean:define type="java.lang.String" id="singleValueId" name="SampleForm" property="sampleSingleValue" />
<input type="text" name="sampleSingleValue" value="<%=singleValueId%>"/>
----------------------------------------------------
↓その結果、以下のようなHTMLが出力される。
----------------------------------------------------
<input type="text" name="sampleSingleValue" value="defaultValue"/>
----------------------------------------------------
このような入力フィールドをイテレータで回す場合は、
以下のように記載することになる。
----------------------------------------------------
<logic:iterate id="data" name="SampleForm" property="sampleList" indexId="idx" >
<bean:define type="java.lang.String" id="roopValueId" name="data" property="beanValue" />
<html:text name="sampleList" property="beanInputValue" indexed="true" value="<%= roopValueId %>"/>
</logic:iterate>
----------------------------------------------------
↓その結果、以下のようなHTMLが出力される。
----------------------------------------------------
<input type="text" name="sampleList[0].beanInputValue" value="defaultValue0">
----------------------------------------------------
しかし、このままでは実行時に
javax.servlet.ServletException: BeanUtils.populate
というサーブレットエラーが発生してしまう。
これはstrutsの仕組みによるもの。
そこで、以下のようにForm内で初期化することで回避できる。
(Actionに初期化処理を記載しても本エラーは回避できない)
----------------------------------------------------
public class SampleForm extends ValidatorForm {
private static final int LIST_CNT_MAX = 10;
private List<SampleBean> _sampleList = new ArrayList<SampleBean>();
/**
* コンストラクタ.
*/
public SampleForm() {
super();
for (int i = 0; i < LIST_CNT_MAX; i++) {
_sampleList.add(new SampleBean());
}
}
public List<SampleBean> getSampleList() {
return _sampleList;
}
public void setSampleList(List<SampleBean> sampleList) {
_sampleList.clear();
_sampleList.addAll(sampleList);
}
// その他のフィールド・ゲッタ・セッタは同様のため省略
}
----------------------------------------------------