- PR -

StrutsでFormのList要素を検証する

投稿者投稿内容
Yamamoto
会議室デビュー日: 2007/11/03
投稿数: 10
投稿日時: 2007-11-21 11:18
StrutsのValidatorについての質問です。よろしくお願いします。

BeanのListを持ったFormをValidatorでチェックすることはできないでしょうか?
複数レコードを一括で入力するようなフォームです。

上手く説明しづらいので、コードを書きます。

コード:
/*
 * このクラスが1レコード分のデータ(nameとaddress)を保持します
 */
public class ValueBean {
	public String name		= null;
	public String address	= null;
	public ValueBean(){}
	
	//ゲッターセッター
	public String getName() {return name;}
	public void setName(String name) {this.name = name;}
	public String getAddress() {return address;}
	public void setAddress(String address) {this.address = address;}
}

/*
 * フォームです。レコードを表すValueBeanをVectorの要素に持っています
 * つまり複数レコードに対応します
 */
public class ListForm extends ActionForm{
	public Vector<ValueBean>	valueList	= null;

	public Vector<ValueBean> getValueList() {
		return valueList;
	}
	public void setValueList(Vector<ValueBean> valueList) {
		this.valueList = valueList;
	}
	public Object getItem(int idx){
		return valueList.elementAt(idx);
	}
}

/*
 * JSPのフォーム部です。
 * ListFormのVector部を展開し、複数レコードの一括入力が可能になっています。
 */
<html:form action="/inputList">
	<logic:iterate name="ListForm" property="valueList" id="item">
		<html:text name="item" property="name" indexed="true" />
		<html:text name="item" property="address" indexed="true" />
	</logic:iterate>
	<html:submit/>
</html:form>


このようなフォームの場合、各レコードのフィールドをValidatorで検証することは、
できないでしょうか?
ちょま吉
大ベテラン
会議室デビュー日: 2004/08/04
投稿数: 112
投稿日時: 2007-11-21 12:46
よくわかりませんが、
Validatorのruleをオリジナルで作ればいいんじゃないですか?
もしくはActionFormのvalidateメソッド実装とか。
Yamamoto
会議室デビュー日: 2007/11/03
投稿数: 10
投稿日時: 2007-11-21 16:24
レスどうもです。

自分で作れば確かにできると思いますが、
Strutsに元からその機能があるなら、それを使いたいと思って、
質問させてもらいました。

やっぱり自分で作るしかないですかね。
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2007-11-21 17:14
DynaActionForm以外で利用可能かどうかはわかりませんが、Validatorプラグインを利用する方法ではいかがでしょうか?
http://www.atmarkit.co.jp/fjava/rensai3/struts05/struts05_1.html

validation.xmlの定義は以下が参考になりそうです。
http://loafer.jp/mixi/diary/class.xsp?2007-05-14-23-57
Yamamoto
会議室デビュー日: 2007/11/03
投稿数: 10
投稿日時: 2007-11-22 11:56
上手く伝わっていないようなので、少し補足します。

Validatorプラグインは DynaActionForm以外のFormでも使えます。
しかし、調べて見つかるのは、主にStringのフィールドに対して検証を行うものです。
(例えば10文字以上はエラーとか、半角英数以外はエラーとか)

上に書いた場合では、ListFormのフィールドはStringでなくVectorです。
VectorがValueBeanのオブジェクトを格納し、
ValueBeanが入力項目に対応するStringを持つという二階層の構造になっています。

こういう場合にValidatorプラグインを適用する方法があるのか?
というのが今回の質問の趣旨になります。
ykSiR
会議室デビュー日: 2006/10/03
投稿数: 16
投稿日時: 2007-11-22 13:25
バージョンを指定されていないので不確かですが、valueList[].nameでどうでしょうか?

http://struts.apache.org/1.2.9/userGuide/dev_validator.html
「Designing Complex Validations with validwhen」
にvalidwhenのサンプルとして記載されています。



[ メッセージ編集済み 編集者: ykSiR 編集日時 2007-11-22 13:26 ]
Yamamoto
会議室デビュー日: 2007/11/03
投稿数: 10
投稿日時: 2007-11-22 16:58
ykSiRさん、ありがとうございます。

挙げられたサンプルを参考に調べてみたところ、
indexedListPropertyというのを使えば配列やListの要素を検証できそうです。

ただ、Listの要素が一つでも検証にひっかかると、
それ以降の要素は検証されないという制約があるようです。

結局、やはりオリジナルで作ることになってしまうかもしれませんね。
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2007-11-22 22:00
indexedListPropertyの例を紹介したつもりでしたが言葉足らずでした。
今読み返すと、Validatorプラグインの存在と、その定義(validation.xml)の説明をしているように見えますね。失礼いたしました。

スキルアップ/キャリアアップ(JOB@IT)