ECサイト構築パッケージOpen-EC ECサイト構築パッケージOpen-EC
会社について BlastJについて パートナー コンタクト

フレームワークとパターン化

バリデータの拡張

リクエストプロセッサとは?

リクエストプロセッサと拡張

MVCモデルと再利用

Eclipseとは


BlastJトップへ戻る

SEO機能付きCMS NEW
次世代WebDB開発言語Alinous-Core

ほぼHTMLとSQLだけでアプリケーション開発。
EclipseプラグインによるGUIデバッガ搭載
今すぐ無料ダウンロード


CROSSFIRE O/R
無料ダウンロード

WEB+DB PRESS VOL.27
BlastJ紹介記事連載掲載がスタートしました。
SoftwareDesign2005年6月号
BlastJ紹介記事が掲載されました。
JavaWorld2005年5月号のNews & ProductsのコーナーでBlastJが紹介されました
SIパートナー

業界TOPクラスのJavaエキスパートによる一括請負サービスを提供いたします。

採用のページはこちら
Webデザイン制作 Mer Design




バリデータ拡張

バリデータ拡張方の概要
Strutsには、デフォルトで「required」「minlength」「maxlength」などがあります。しかし、実際のアプリケーション開発では、これだけでは足りないことがほとんどです。
バリデータを自作できると、フレームワークとパターン化で書いたようなパターン化設計がかなりしやすくなるので、かなりお勧めです。
バリデータ拡張のステップ
バリデータの拡張法は、大きく分けて次の3ステップです。
ステップ1. validator-rules.xml内で、自作バリデータの定義
ステップ2. バリデータ本体の作成
ステップ3. メッセージの追加
ステップ1.validator-rules.xml内で、自作バリデータの定義
まずは、validator-rules.xmlの内容を追加します。
作る自作バリデータの内容としては、requireと同じものを作ります。
validator-rules.xml
<form-validation>

   <global>

      <validator name="myrequired"
            classname="org.crossfire.validator.MyFieldChecks"
               method="validateRequired"
         methodParams="java.lang.Object,
                       org.apache.commons.validator.ValidatorAction,
                       org.apache.commons.validator.Field,
                       org.apache.struts.action.ActionMessages,
                       javax.servlet.http.HttpServletRequest"
                  msg="errors.myrequired"/>
  
                 (途中省略)
   </global>

</form-validation>
バリデータの名前は、「myrequired」で、それを実装するクラスが「org.crossfire.validator.MyFieldChecks」、その中の「validateRequired」メソッドで実際の処理を行うという設定です。
methodParamsは、今回はパラメータが5個のタイプを使うことにします。
(パラメータが6個のタイプもあるのですが、それは補足で説明します。)
msgは、エラーメッセージのキーです。
(ステップ3で使います。)
ステップ2.バリデータ本体の作成
ステップ1で設定した「org.crossfire.validator.MyFieldChecks」を実装します。
MyFieldChecks.java
package org.crossfire.validator.MyFieldChecks;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericTypeValidator;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.UrlValidator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.util.ValidatorUtils;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.util.RequestUtils;

/**
 * 自作バリデータ
**/
public class MyFieldChecks implements Serializable {
    /**
     * 
     * including whitespace.
     *
     * @param バリデータをかけるBean
     * @param va 現在実行しているバリデータそのもの
     * @param field 今、バリデータにかけられているフィールド
     * @param errors エラーが起きたときには、このオブジェクトに付け加えていく
     * @param request 現在のリクエスト
     * @return バリデーション成功時 true , その他のときは false.
     */
    public static boolean validateRequired(Object bean,
                                           ValidatorAction va, Field field,
                                           ActionMessages errors,
                                           HttpServletRequest request) {

        String value = null;
        if (isString(bean)) {
            value = (String) bean;
        } else {
            // Beanの中から、現在バリデーション対象のフィールドの値を
            // 取ってくる
            value = 
               ValidatorUtils.getValueAsString(bean, field.getProperty());
        }

        if (GenericValidator.isBlankOrNull(value)) {
            // バリデーション失敗時には、エラーメッセージをerrorsに追加
            errors.add(field.getKey(), 
                       Resources.getActionMessage(request, va, field));
            return false;
        } else {
            return true;  // バリデーション成功
        }

    }
}

ステップ3.メッセージの追加
ここまでくれば、ほぼ完成です。あとは、リソースファイル(*.properties)に、

errors.required={0} is required.

と付け加えましょう。

補足.メソッドのパラメータが6個の場合
ステップ1で、methodParamsが5個の場合を説明しましたが、6個でもOKです。
どのような場合に使うかと言うと、現在バリデータをかけているフィールド以外のフィールドも参照したい場合などです。
詳細は、Strutsのソースコードの「org.apache.struts.validator.FieldChecks」クラスの
「validateRequiredIf」メソッドのソースを参照すると分かりやすいです。
validator-rules.xml
<form-validation>

   <global>

      <validator name="myrequired"
            classname="org.crossfire.validator.MyFieldChecks"
               method="validateRequired"
         methodParams=""java.lang.Object,
                               org.apache.commons.validator.ValidatorAction,
                               org.apache.commons.validator.Field,
                               org.apache.struts.action.ActionMessages,
                               org.apache.commons.validator.Validator,
                               javax.servlet.http.HttpServletRequest"
                  msg="errors.myrequired"/>
  
                 (途中省略)
   </global>

</form-validation>



COPYRIGHT (C) 2005 CROSSFIRE JAPAN INC. All Right Reserved