- PR -

StrutsのValidatorの実装で複数の値の処理は?

投稿者投稿内容
sumin
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 93
投稿日時: 2004-02-04 21:30
StrutsのValidatorを拡張してカスタムバリデータを作成中です。が、個々の項目のチェックとしては上手く行きますがSelectなど同じキーで複数の値がStringの配列としてくる場合はどうなるんでしょうか?確かにカスタムバリデータの中にはStringの配列として入って来ています。これを処理するのは簡単ですがStrutsのもともとのバリデータではそんな処理はしてないですね。それはなんででしょうか?

また、Selectなど同じキーを持っている複数の属性ってstruts-config.xmlでタイプは何に設定するんでしょうか?String[]?

こういうケースってどう対応すべきでしょうか?Webでもカスタム・バリデータについての資料はあまりないですね。


[ メッセージ編集済み 編集者: sumin 編集日時 2004-02-04 21:54 ]
あら
会議室デビュー日: 2003/10/03
投稿数: 8
お住まい・勤務地: 札幌
投稿日時: 2004-02-05 08:24
Selectなど同じキーを持っている複数の属性の場合、struts-config.xmlのタイプには、[java.lang.String[]]を使っています。

で、こういうケースでは、カスタムバリデータを作ってます。
作り方は、ソースを見ると一目瞭然ですよね。

[ メッセージ編集済み 編集者: あら 編集日時 2004-02-05 08:25 ]
sumin
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 93
投稿日時: 2004-02-05 09:43
引用:

で、こういうケースでは、カスタムバリデータを作ってます。
作り方は、ソースを見ると一目瞭然ですよね。



いいえ、全然一目瞭然ではありません。その話ならStrutsで基本で提供されているint, float, maxLengthなどなども複数の値を持つキー用に拡張ないしはカスタムバリデータを作成する必要があるとの事でしょうか?
本当にそうでしたら、Strutsから最初から提供された方がよさそうな気がしますね。。
ふーばー
大ベテラン
会議室デビュー日: 2003/06/05
投稿数: 163
投稿日時: 2004-02-05 10:02
引用:

suminさんの書き込み (2004-02-05 09:43) より:
引用:

で、こういうケースでは、カスタムバリデータを作ってます。
作り方は、ソースを見ると一目瞭然ですよね。



いいえ、全然一目瞭然ではありません。



ホントにソース見てみました?1つのオブジェクトをチェックするところを配列の各要素を
チェックするように書き換えるだけでしょ?「一目瞭然」だと思いますけどね。
sumin
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 93
投稿日時: 2004-02-05 10:22
引用:

ホントにソース見てみました?1つのオブジェクトをチェックするところを配列の各要素を
チェックするように書き換えるだけでしょ?「一目瞭然」だと思いますけどね。



ソースはもちろん読みました。確かにチェックのロジック自体はすごく簡単ですが私が気にした部分は下記のようなところです。

 ・validateXXXと言うチェックのメソッドの中で型チェックを行うべきかでないとそのチェックはStrutsのフレームワークでやってくれてこのメソッドはそのケースごとに数回呼ばれるかがよく分からない(←これはチェックのロジックだけの話ではなくその前の段階での話しですね。確かにこれもソースを追えばいいはずですが趣味の世界でもないですし時間も限られてますので。。全体の流れも知らず下手に追加して同じチェックが二回行われるのもあまり望ましくないし。。)
 ・validateXXXと言うメソッドのパラメータでbeanなどがValidateFormとかになっているのは予想以外でした。またFieldの使い方は未だによく分かりません。特にindexedPropertiesなどの用途と使えるケースがよく分かりません。ソースにも全然コメント・説明なしです。これは私がcommonsプロジェクトにあまり知識がないからでもあります。
 ・validateXXXメソッドの説明もあまりないです。最初戻り値をfalseにすれば失敗だと知って画面の遷移先が変わるだろうと思ったんですが違いました。ActionErrorにメッセージを追加しないと画面遷移は変わりませんでした。では戻り値の役割は何?多分次のネストされたValidationが行われないようにする事?と推測しています。そこら辺の資料は私の本でもウェブでも探せませんでした。

他にまたあったかも知りませんが今すぐ覚えられるのはこれくらいですね。このような理由で少なくとも私にはぜんぜん「一目瞭然」ではありませんでした。

ついでに、上記で挙げた疑問点について教えて頂きますと本当にありがたいですが。。。
ふーばー
大ベテラン
会議室デビュー日: 2003/06/05
投稿数: 163
投稿日時: 2004-02-05 12:06
引用:

 ・validateXXXと言うチェックのメソッドの中で型チェックを行うべきかでないとそのチェックはStrutsのフレームワークでやってくれてこのメソッドはそのケースごとに数回呼ばれるかがよく分からない(←これはチェックのロジックだけの話ではなくその前の段階での話しですね。確かにこれもソースを追えばいいはずですが趣味の世界でもないですし時間も限られてますので。。全体の流れも知らず下手に追加して同じチェックが二回行われるのもあまり望ましくないし。。)



これはないでしょう。普通に考えて。
同じエラーメッセージが複数表示されることがないですし。

引用:

 ・validateXXXと言うメソッドのパラメータでbeanなどがValidateFormとかになっているのは予想以外でした。またFieldの使い方は未だによく分かりません。特にindexedPropertiesなどの用途と使えるケースがよく分かりません。ソースにも全然コメント・説明なしです。これは私がcommonsプロジェクトにあまり知識がないからでもあります。



バリデータを使う場合は、ValidatorForm を使うというのは基本です。
カスタムバリデータを作る場合は、commons.validator の知識は必須です。
ドキュメントやソースを読んで勉強するしかないでしょう。

引用:

 ・validateXXXメソッドの説明もあまりないです。最初戻り値をfalseにすれば失敗だと知って画面の遷移先が変わるだろうと思ったんですが違いました。ActionErrorにメッセージを追加しないと画面遷移は変わりませんでした。では戻り値の役割は何?多分次のネストされたValidationが行われないようにする事?と推測しています。そこら辺の資料は私の本でもウェブでも探せませんでした。



この辺もソースを追っかけていくしかないですね。洋書なら本になってそうですが。
sumin さんがやりたいことはかなり上級なことなので、現在の状況では自分で勉強
するしかないですね。
sumin
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 93
投稿日時: 2004-02-05 14:07
今何より困っているのは同じキーで複数の値を持つ場合、各値をどうやってvalidateXXXメソッドの中で取得するかです。パラメータで渡されたものだけでは今まではなかなか難しいですね。。。
うん。。悔しい。。。
sumin
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 93
投稿日時: 2004-02-05 16:39
取り合えず、下記のようなコードで実装はしました。
あまり綺麗ではないけど、参考として、、

public static boolean validateFlagType(
Object bean,
ValidatorAction va,
Field field,
ActionErrors errors,
HttpServletRequest request) {

// バリデーション対象がStringである場合はそのままバリデーションを実行
if (isString(bean))
return StringUtil.isFlagType((String) bean);

if (bean instanceof DynaActionForm) {
Object temp = ((DynaActionForm) bean).get(field.getProperty());
// チェック項目が空である場合は無視する。
if(temp==null || temp.equals("")) return true;
String[] value = isString(temp) ? new String[] {(String) temp }
: (String[]) temp;

for (int i = 0; i < value.length; i++) {
if (!StringUtil.isFlagType(value[i])) {
errors.add(
field.getKey(),
Resources.getActionError(request, va, field));
return false;
}
}
return true;
}
// バリデーションの対象がStringでもDynaActionFormでもない場合はバリデーションの対象から外す。
return false;
}

[ メッセージ編集済み 編集者: sumin 編集日時 2004-02-05 18:08 ]

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