リファレンストップへ Java | バリデータ(入力チェック)【ルールの自作】使用した環境 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タグの属性値の意味は以下のようになります。
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( といったように、ValidatorUtils#getValueAsStringを使用する事で、フォーム内の任意のプロパティの値を取得する事が可能です。Object bean , ValidatorAction va , Field field , ActionMessages errors , Validator validator , HttpServletRequest request) { // フォーム内のプロパティの値を取得する String propValue = ValidatorUtils.getValueAsString(form, "取得対象のプロパティ名"); 取得対象のプロパティ名を変数(パラメータ)として定義しておく事で、 複数のプロパティの値を対象とした相関的チェックを作成する事も可能となります。 |
|