Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。

Validator

ここではStrutsValidatorについて解説します。Validatorとは、アクション・フォームBeanに入力された値が指定した条件(必須入力、入力パターンなど)に合致しているかを調べ、合致していない場合はエラーを表示する仕組みです。

実行環境
  • ・WindowsXP Home Edition
  • ・J2SDK 1.4.2_04
  • ・Tomcat 5.0.18
  • ・Struts 1.2.4

概要

Validatorはタグの指定のみでアクション・フォームBeanに入力される値のチェックを行うことができます。入力値ごとにチェックプログラムを記述する必要がなく、簡易な設定で入力値のチェックを行うことができます。

Validatorで確認できるルール

ルール名 内容
required 入力必須の確認。
validwhen 指定した条件式に合致するかの確認。使用する際はantlr.jarが必要。
minlength 指定した文字数より少なくないかの確認。
maxlength 指定した文字数より多くないかの確認。
mask 指定した正規表現に合致する値かの確認。
byte Byte型のクラスに変換できる値かの確認。
short Short型のクラスに変換できる値かの確認。
integer Integer型のクラスに変換できる値かの確認。
long Long型のクラスに変換できる値かの確認。
float Float型のクラスに変換できる値かの確認。
double Double型のクラスに変換できる値かの確認。
date Date型のクラスに変換できる値かの確認。変換できるかはSimpleDateFormatクラスを利用する。
intRange 指定した数値の範囲内の値かの確認。値はInteger型のクラスに変換できる必要がある。
floatRange 指定した数値の範囲内の値かの確認。値はFloat型のクラスに変換できる必要がある。
doubleRange 指定した数値の範囲内の値かの確認。値はDouble型のクラスに変換できる必要がある。
creditCard クレジットカード番号のフォーマットに合致する値かの確認。
email メールアドレスのフォーマットに合致する値かの確認。
url URLのフォーマットに合致する値かの確認。

基本設定

Validatorを利用する場合の基本的な設定例について解説します。

  1. アクション・フォームBeanにValidator処理を行うための記述を行います。
  2. アクション・フォームBeanの各プロパティに適用するValidatorルールをvalidation.xmlに記述します。Validator自体の動作はvalidator-rules.xmlに定義されています。validator-rules.xmlはあらかじめ定義されているものを使用します。
  3. メッセージ・リソースファイルにvalidation.xmlのルールに合致しなかった場合に表示するエラーメッセージを記述します。
  4. エラーメッセージを表示するための、JSPプログラムを作成します。
  5. struts-config.xmlにValidator関連の設定を行います。

1. アクション・フォームBeanの作成

【ExValidatorForm.java】

package struts;

import org.apache.struts.validator.*;
import org.apache.struts.action.*;

//Validatorを使用する場合はValidatorFormクラスを継承します。
//その他は一般的なアクション・フォームBeanの作成方法と変わりません。
public final class ExValidatorForm extends ValidatorForm {
    private String requireV;
    private String validwhenV;
    private String countV;
    private String patternV;
    private String dateV;
    private String rangeV;
    private String emailV;

    public void setRequireV(String requireV)
            {this.requireV = requireV;}
    public void setValidwhenV(String validwhenV)
            {this.validwhenV = validwhenV;}
    public void setCountV(String countV)
             {this.countV = countV;}
    public void setPatternV(String patternV)
            {this.patternV = patternV;}
    public void setDateV(String dateV)
            {this.dateV = dateV;}
    public void setRangeV(String rangeV)
            {this.rangeV = rangeV;}
    public void setEmailV(String emailV)
            {this.emailV = emailV;}

    public String getRequireV() {return requireV;}
    public String getValidwhenV() {return validwhenV;}
    public String getCountV() {return countV;}
    public String getPatternV() {return patternV;}
    public String getDateV() {return dateV;}
    public String getRangeV() {return rangeV;}
    public String getEmailV() {return emailV;}
}

2. validation.xmlの作成

【validation.xml】

<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE form-validation PUBLIC
    "-//Apache Software Foundation//
    DTD Commons Validator Rules Configuration 1.1.3//EN"
    "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">

<form-validation>
    <formset>
        <!-- 適用するアクション・フォームBeanを論理名で指定  -->
        <form name="ExValidator">
            <!-- requiredルールの指定 -->
            <field property="requireV" depends="required">
            </field>
            <!-- validwhenルールの指定
                                validwhenの条件式をtest変数で指定
                                *this*はプロパティvalidwhenVを表す -->
            <field property="validwhenV" depends="validwhen">
                <msg name="validwhen" key="errors.validwhen" />
                <var>
                    <var-name>test</var-name>
                    <var-value>
                        ((*this* != null) and (countV != null))
                    </var-value>
                </var>
            </field>
            <!-- minlengthルールの指定
                                minlength変数で条件の最低入力数を指定 -->
            <field property="countV" depends="minlength">
                <var>
                    <var-name>minlength</var-name>
                    <var-value>4</var-value>
                </var>
            </field>
            <!-- maskルールの指定
                                mask変数で条件パターンを指定 -->
            <field property="patternV" depends="mask">
                <var>
                    <var-name>mask</var-name>
                    <var-value>^[a-zA-Z]*$</var-value>
                </var>
            </field>
            <!-- dateルールの指定
                                datePattern変数で条件の日時パターンを指定 -->
            <field property="dateV" depends="date">
                <msg name="date" key="errors.date" />
                <var>
                    <var-name>datePattern</var-name>
                    <var-value>yyyy/mm/dd</var-value>
                </var>
            </field>
            <!-- intRangeルールの指定
                                max変数、min変数で条件の範囲を指定 -->
            <field property="rangeV" depends="intRange">
                <var>
                    <var-name>min</var-name>
                    <var-value>4</var-value>
                </var>
                <var>
                    <var-name>max</var-name>
                    <var-value>16</var-value>
                </var>
            </field>
            <!-- emailルールの指定 -->
            <field property="emailV" depends="email">
            </field>
        </form>
    </formset>
</form-validation>

各ルールに設定するサブ要素を以下に記載します。

各ルールのサブ要素

ルール名 サブ要素 内容
required - -
validwhen test 指定した条件式に合致するかの確認。使用する際はantlr.jarが必要。
minlength minlength 指定した文字数より少なくないかの確認。
maxlength maxlength 指定した文字数より多くないかの確認。
mask mask 指定した正規表現に合致する値かの確認。
byte - -
short - -
integer - -
long - -
float - -
double - -
date datePattern 日時パターンを指定。パターンはSimpleDateFormatクラスを利用する。datePatternStrictは厳密なパターンが適用される。yyyy/mm/ddで2005/1/1はパターンに合致しない2005/01/01の場合はパターンに合致する。
datePatternStrict
intRange min minは最小値、maxは最大値
max
floatRange min minは最小値、maxは最大値
max
doubleRange min minは最小値、maxは最大値
max
creditCard - -
email - -
url allowallschemes スキームを許可するかどうか。trueを設定するとすべてのスキームが許可される。デフォルトはfalse。
allow2slashes ダブルスラッシュ(//)を許可するかどうか。デフォルトはfalse。
nofragments URLの分割を許可するかどうか。デフォルトはfalse(分割を許可する)。
schemes 許可するスキームを,(カンマ)で指定する。デフォルトはhttp, https, ftp。

3. メッセージ・リソースファイルの作成

【application.properties】

errors.required =requireV is wrong.<br>
errors.validwhen=validwhenV is wrong.<br>
errors.minlength=countV is wrong.<br>
errors.invalid  =patternV is wrong.<br>
errors.date     =dateV is wrong.<br>
errors.range    =rangeV is wrong.<br>
errors.email    =emailV is wrong.<br>

validator-rules.xmlにルールごとに該当するメッセージ・リソースファイルのキーが定義されています。以下に定義されているキーを記載します。また、validation.xmlに<msg>タグを記載することで、任意のキーを使用することができます。

メッセージ・リソースファイルのキー

ルール名 内容
required errors.required
validwhen errors.required
minlength errors.minlength
maxlength errors.maxlength
mask errors.invalid
byte errors.byte
short errors.short
integer errors.integer
long errors.long
float errors.float
double errors.double
date errors.date
intRange errors.range
floatRange errors.range
doubleRange errors.range
creditCard errors.creditcard
email errors.email
url errors.url

4. JSPの作成

【error.jsp】Validatorルールに合致したなかったときに表示されるエラー画面です。

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>
<%@ taglib uri="/tags/struts-bean" prefix="bean" %>

<html:html>
<head><title>エラー画面</title></head>
<body>

エラーメッセージ
<br>
<%-- <html:messages>タグでエラーメッセージを表示します。エラーメッセージを表示するときはmessage属性をfalseにします。 --%>
<html:messages id="msg" message="false">
    <%-- filter属性をfalseにすることでメッセージにHTMLタグを利用できます。trueにするとHTMLタグがあった場合置換文字(<、>など)に変換します。 --%>
    <bean:write name="msg" ignore="true" filter="false"/>
</html:messages>

</body>
</html:html>

【exValidator.jsp】Validatorチェックを行う値を入力するフォーム画面です。

<%@ page contentType="text/html; charset=Shift_JIS" %>
<%@ taglib uri="/tags/struts-html" prefix="html" %>

<html:html>
<head><title>Validator処理</title></head>
<body>

<html:form action="/ExValidator">
    入力必須
    <br>
    <html:text property="requireV" size="16"/>
    <br><br>
    validwhen
    <br>
    <html:text property="validwhenV" size="16"/>
    <br><br>
    文字数確認
    <br>
    <html:text property="countV" size="16"/>
    <br><br>
    パターン確認
    <br>
    <html:text property="patternV" size="16"/>
    <br><br>
    日付確認
    <br>
    <html:text property="dateV" size="16"/>
    <br><br>
    範囲確認
    <br>
    <html:text property="rangeV" size="16"/>
    <br><br>
    メールアドレス確認
    <br>
    <html:text property="emailV" size="16"/>
    <br><br>
    <html:submit property="submit" value="送信"/>
</html:form>

</body>
</html:html>

5. struts-config.xmlの作成

【struts-config.xml】

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://struts.apache.org/dtds/struts-config_1_2.dtd">

<struts-config>

    <!-- アクション・フォームBeanの指定 -->
    <form-beans>
        <form-bean name="ExValidator"
                   type="struts.ExValidatorForm" />
    </form-beans>

    <!-- アクション・クラスの指定 -->
    <action-mappings>
        <!-- Validatorを使用する場合validate属性をtrueに指定。
             Validatorのエラーを表示する画面をinput属性で指定。 -->
        <action path="/ExValidator"
                    type="struts.ExValidatorAction"
                    name="ExValidator"
                    scope="request"
                    validate="true"
                    input="/error.jsp">
            <forward name="info" path="/exValidator2.jsp"/>
        </action>
    </action-mappings>

    <!-- メッセージ・リソースファイルの指定 -->
    <message-resources parameter="resources.application"/>

    <!-- Validatorの指定。プロパティpathnamesの値に
         validator-rules.xmlとvalidation.xmlを指定 -->
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
        <set-property property="pathnames"
                      value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
    </plug-in>

</struts-config>

実行結果

Struts実行結果_1
Struts実行結果_2

応用処理

1. 複数条件指定

<file>タグのdepends属性に値を複数指定することにより、チェックする条件を複数指定することができます。emailフォーマットチェック且つ、必須入力チェックなど条件を組み合わせて指定できます。

depends属性に複数条件を指定

<!-- emailフォーマットチェックと必須入力チェックを指定 -->
<field property="emailV" depends="email,required">
</field>

2. エラーメッセージに可変置き換え文字を利用

<field>タグに<argn>タグ(nは0~3のいずれか)を指定することで、エラーメッセージに可変置き換え文字を使用することができます。可変置き換え文字はメッセージ・リソースファイルで指定、直接指定、<var>タグの変数指定のいずれかを選ぶことができます。直接指定、<var>タグの変数指定を行う場合は<argn>タグのresource属性にfalseを指定する必要があります。

<argn>タグを指定

・・・・・
<field property="countV" depends="minlength">
    <!-- 可変置き換え文字にメッセージ・リソースファイルの
         "minlength.msg"を指定 -->
    <arg0 key="minlength.msg" />
    <!-- 可変置き換え文字に<var>タグのminlengthを指定 -->
    <arg1 key="${var:minlength}" resource="false" />
    <var>
        <var-name>minlength</var-name>
        <var-value>4</var-value>
    </var>
</field>
・・・・・

メッセージ・リソースファイル

errors.minlength={0} needs over {1} characters.
minlength.msg=minlength

3. メッセージ・リソースファイルのキーを指定

<field>タグに<msg>タグを指定することで参照されるメッセージ・リソースファイルのキーを変更することができます。

<msg>タグを指定

・・・・・
<field property="requireV" depends="required">
    <!-- エラー時のメッセージ・リソースファイルのキーを
         "errors.original.required"に変更 -->
    <msg name="required" key="errors.original.required" />
</field>
・・・・・

4. 動的アクション・フォームBeanにValidatorを使用

動的アクション・フォームBeanにValidatorを使用することができます。struts-config.xmlのタグのtype属性にDynaValidatorFormを指定するだけで使用することができます。他の部分はアクション・フォームBean時のValidatorの使用方法と同一です。

<form-bean>タグにDynaValidatorFromを指定

・・・・・
    <form-beans>
        <!-- type属性にDynaValidatorFormを指定 -->
        <form-bean
                    name="DynaForm"
                    type="org.apache.struts.validator.DynaValidatorForm">
            <form-property
                            name="requireV"
                            type="java.lang.String" />
        </form-bean>
    </form-beans>

    <action-mappings>
        <action path="/ExValidator"
                    type="struts.ExValidatorAction"
                    name="DynaForm"
                    scope="request"
                    validate="true"
                    input="/error.jsp">
            <forward name="info" path="/exValidator2.jsp"/>
        </action>
    </action-mappings>
・・・・・

17Validator