PGBox
P
G
Box

バリデータ(入力チェック)【ルールの自作】

機能リファレンスのメニューへ戻る



使用した環境
JDK 6 Update 11
struts 1.3.10

入力チェックバリデータのルールを自作・拡張(カスタマイズ)する場合のサンプルです。


strutsであらかじめ用意されている入力チェックルールだけでは行えない入力チェックがある場合は
独自に作成したバリデータメソッドをルールに追加する事ができます。

入力チェックメソッドの作成と追加


このサンプルでは、入力された値が半角英字のみで構成されているかをチェックするルールを作成してみます。

まず、以下のように入力チェッククラスを作成します。
import java.util.regex.Pattern;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.Validator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.util.ValidatorUtils;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.validator.Resources;

public class OriginalCheck {
    
    /** 半角英字のみがマッチするパターン */
    private static Pattern alphaPattern = Pattern.compile("^[a-zA-Z]*$");
    
    /**
     * 半角英字のみで構成されているかをチェックするバリデータメソッド
     * @param bean
     * @param va
     * @param field
     * @param errors
     * @param validator
     * @param request
     * @return
     */
    public static boolean validateAlpha(
            Object bean
            , ValidatorAction va
            , Field field
            , ActionMessages errors
            , Validator validator
            , HttpServletRequest request) {
        
        // bean(フォーム)から入力チェック対象の値を取得する
        String value = evaluateBean(bean, field);
        
        // チェック対象の値が空の場合は入力チェックを行わない
        if (value == null || value.length() == 0) {
            return true;
        }
        
        // 半角英字のみであるかをチェックする
        if (alphaPattern.matcher(value).matches()) {
            // 正常な値の場合:trueを返す
            return true;
        }
        
        // 異常値の場合:エラーメッセージを追加してfalseを返す
        errors.add(field.getKey(),
            Resources.getActionMessage(validator, request, va, field));
        
        return false;
    }
    
    /**
     * bean(フォーム)から入力チェック対象の値を取得する
     * @param bean
     * @param field
     * @return
     */
    private static String evaluateBean(Object bean, Field field) {
        String value;

        if (bean == null || String.class.isInstance(bean)) {
            value = (String) bean;
        } else {
            value = ValidatorUtils.getValueAsString(bean, field.getProperty());
        }

        return value;
    }
    
}

実際に入力チェックを行うメソッドは
validateAlpha
になります。

入力チェックメソッドは
public static であり、booleanを戻り値としなくてはなりません。
また、引数は
    Object bean
    , ValidatorAction va
    , Field field
    , ActionMessages errors
    , Validator validator
    , HttpServletRequest request
といった構成になります。

メソッド名は自由に決めて構いません。


次に、このメソッドが使用できるようにするために、validation.xmlに定義を行います。
validation.xml
<form-validation>

    <global>

        <validator name="alpha"
                   classname="xxx.OriginalCheck"
                   method="validateAlpha"
                   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"
                   depends=""
                   msg="errors.alpha"/>

    </global>

    <formset>
        
        (※各フォームの入力チェック定義)
        
    </formset>
    
</form-validation>

上記のように、<global>タグ内に<validator>タグを記述しする事によって独自のバリデータルールを定義する事ができます。

validatorタグの属性値の意味は以下のようになります。
属性意味
nameルールの名前を定義する。
classname入力チェックメソッドが定義されているクラス名をパッケージ名からの完全名で指定する。
method入力チェックメソッド名を指定する。
methodParams入力チェックメソッドの引数を記述する。※上記サンプルの通りに記述すれば問題ありません。
depends入力チェックメソッドの実行前にあらかじめ行っておく入力チェックルール名を指定する。カンマ区切りで複数指定可能。
msg入力チェックエラー時のエラーメッセージのデフォルトのキーを指定する。


depends属性では、例えば上記サンプルの場合depends="required"と指定しておくと、必須チェック&半角英字チェックが行われる事になります。
depends="required, integer"といったように複数指定する事も可能です。


定義した自作バリデータは、通常のルールと同様に
<formset>
    
    <form name="SampleForm">
        
        <field property="textA" depends="alpha">
            <arg key="label.textA" />
        </field>

    </form>

</formset>
といったように使用する事が可能です。


変数(パラメータ)の取得


例えばmaxlengthルールでは
<field property="xxx" depends="maxlength">
    <var>
        <var-name>maxlength</var-name>
        <var-value>3</var-value>
    </var>
</field>
といったように変数(パラメータ)を与えて、入力可能な最大文字数を指定する事が可能です。

この変数は、バリデータメソッド内で、以下のようにして取得する事が可能です。

public static boolean validateOriginal(
        Object bean
        , ValidatorAction va
        , Field field
        , ActionMessages errors
        , Validator validator
        , HttpServletRequest request) {
        
        // 変数「original」を取得
        String originalVar =
            Resources.getVarValue("original", field, validator, request, true);

取得方法は
Resources.getVarValue("取得する変数名", field, validator, request, 必須の場合にtrue);
となります。引数の最後のbooleanは必須変数である場合にtrueとします。
trueとした場合、その変数がvalidation.xmlで指定されていない場合に
IllegalArgumentExceptionが発生するようになります。


入力チェック対象のプロパティ以外のプロパティの値を取得する


requiredifルールのように、他のプロパティの値を取得し、相関的なチェックを作成する場合は
public static boolean validateOriginal(
        Object bean
        , ValidatorAction va
        , Field field
        , ActionMessages errors
        , Validator validator
        , HttpServletRequest request) {
        
        // フォーム内のプロパティの値を取得する
        String propValue = ValidatorUtils.getValueAsString(form, "取得対象のプロパティ名");

といったように、ValidatorUtils#getValueAsStringを使用する事で、フォーム内の任意のプロパティの値を取得する事が可能です。

取得対象のプロパティ名を変数(パラメータ)として定義しておく事で、
複数のプロパティの値を対象とした相関的チェックを作成する事も可能となります。





機能リファレンスのメニューへ戻る