goo blog サービス終了のお知らせ 

実験用ブログ

・勉強したことをメモしておく

【Struts】logic:iterate内のテキストボックスの値の設定と取得

2012-06-30 13:50:05 | 勉強

まず、以下のようなフォームを準備する。

----------------------------------------------------
public class SampleForm extends ValidatorForm {
private 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);
}

// その他のフィールド・ゲッタ・セッタは同様のため省略
}
----------------------------------------------------

最新の画像もっと見る