Struts アクションフォーム(DynaValidatorForm)
開発メモ.COM
Java
Eclipse Eclipse
Eclipseプラグイン Eclipseプラグイン(Plugin)
Struts Struts
 
Strutsのインストール  インストール
Strutsのアクションフォーム  アクションフォーム
Strutsのアクション  アクション
StrutsのTiles  Tiles
JUnit関連 テスト関連

データベース
MYSQL MYSQL
PostgreSQL PostgreSQL

サーバ環境関連
レンタルサーバ レンタルサーバ
Apache、PHP Apache
Tomcat Tomcat
JBOSS JBOSS
CVS CVS

その他
開発メモの利用において 本サイトご利用において
開発メモのサイトマップ サイトマップ
開発メモの問合せ 問い合わせ

TOP > Struts > アクションフォーム(DynaValidatorForm)

Struts アクションフォーム(DynaValidatorForm)

Strutsで入力されたデータの検証(入力チェック)を行なうのにソースを作成せず、
いくつかのファイルの記述のみで対応できるアクションフォーム(DynaValidatorForm)に
関するファイルの設定、チェッククラスの拡張等を説明します。


struts-config.xmlの設定

Strutsの入力検証でチェックするメッセージファイルを説明します。
これ以降に説明するstruts-config.xmlはアクションフォームの設定を抜粋した内容となっています。

<message-resources parameter="property.MessageResources" null="false/>

上記の設定でStrutsの入力検証で使用するメッセージの設定が行なわれました。
WEB-INF/classes/配下に「property/MessageResources.properties」が存在することとなります。
MessageResources.propertiesはキーとメッセージが対になっています。
属性の概要は下記の一覧を参照してください。

message-resourcesタグ
parameter メッセージファイルの配置ディレクトリ、ファイル名を指定します。
null メッセージが存在しない場合の処理を指定します。
上記ではfalseを指定しているため、エラーとなります。

次にStrutsのDynaValidatorFormが有効になるようにプラグインを設定します。

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>

上記の設定でValidatorPlugInにvalidator-rules.xmlとvalidation.xmlのパスの設定をしています。
パスを指定したStrutsの各xmlの概要は下記の一覧を参照してください。

Strutsの設定ファイル
validator-rules.xml 入力検証を行なうルールを定義している
validation.xml 実際にアクションフォームがどの入力検証をするかを記述している

次に個々のStrutsアクションフォームが取得する項目名と項目の型を指定します。

<form-beans>
    <form-bean name="formName" type="org.apache.struts.validator.DynaValidatorForm">
        <form-property name="userName" type="java.lang.String"/>
        <form-property name="address" type="java.lang.String"/>
    </form-bean>
</form-beans>

上記は個別のStrutsアクションフォームを表し、フォームごとにform-beanタグが存在します。
この設定でリクエストデータを取得することができます。属性の概要は下記の一覧を参照してください。

form-beanタグ
name アクションフォームの名前(上記ではformName)を表します。
この名前でアクションがどのアクションフォームを使うかを決定します。
type 実際のアクションフォームのクラスを表します。

form-propertyタグ
name プロパティの名前を表します。
この名前はブラウザから送られてくるリクエストのキーと同じでなければなりません。
type name属性で指定したプロパティの型を表します。(上記ではStringを指定)
型はプリミティブ型、String、配列、コレクション等が指定できます。
initial 初期値を設定するときに使用します。
今回は使用していないためtypeで指定した型の初期値が設定されます。

validator-rules.xmlの設定

Strutsのvalidator-rules.xmlは入力検証を行なう際のルールが定義されています。
例えば必須チェック、長さチェック等がデフォルトで定義されていて下記で説明する
validation.xmlで呼び出すことができます。
以下に使用頻度の高いデフォルトで用意されているルールの一覧を記述します。

バリデータールール一覧
required 入力必須のチェック
minlength 最小文字数(バイト数ではない)のチェック
maxlength 最大文字数(バイト数ではない)のチェック
mask 指定した正規表現と一致するかをチェック
intRange 指定した数値の範囲内かをチェック
email メールアドレスのフォーマットチェック
url URLのフォーマットチェック
validwhen 指定した条件式と一致するかをチェック

validation.xmlの設定

Strutsのvalidation.xmlはstruts-config.xmlで定義したform-beanタグの入力内容を
validator-rules.xmlのルールを使用してStrutsでチェックを行なう設定をするファイルです。

<form-validation>
    <formset>
        <form name="formName">
            <field property="userName" depends="required">
                <arg0 key="ユーザ名" resource="false" />
            </field>
            <field property="address" depends="required,maxlength">
                <arg0 key="住所" resource="false"/>
                <var>
                    <var-name>maxlength</var-name>
                    <var-value>32</var-value>
                </var>
            </field>
        </form>
    </formset>
</form-validation>

上記の例ではuserNameはrequired、addressはrequiredとmaxlengthのチェックを行なう設定です。
arg0タグは上記で設定したMessageResources.propertiesに例えばメッセージ「{0}は必須」があれば
{0}の部分をkeyで指定した値に置き換えます。(userNameの場合は「ユーザ名は必須」となる)
また、resource属性をfalseにするとリソースバンドルを使用する設定となります。
ここまでで基本的なStrutsへの設定は終了です。※次はアクションで実行する設定を参照。

validator-rules.xmlの拡張

上記の内容で基本的な操作は可能になりましたが今度はvalidator-rules.xmlに存在しない
ルールをStrutsで拡張(追加)したい場合の説明します。

拡張クラスの作成方法はjava.io.Serializableをimplementsしてルール分のメソッドを追加します。
メソッドはstaticメソッド(public)で引数(サンプル参照)、戻り値をboolean型(trueがチェック正常)
を返せば後は自由です。

package pkg;
import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.ValidatorUtil;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.validator.Resources;

public class ExpanseFieldChecks implements Serializable {

    protected static boolean isString(Object o) {
        return (o == null) ? true : String.class.isInstance(o);
    }

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

        String value = null;
        if (isString(bean)) {
            value = (String) bean;
        } else {
            value = ValidatorUtil.getValueAsString(bean, field.getProperty());
        }
        if (value.equals("test")) {
            return true;
        }
        errors.add(field.getKey(), Resources.getActionMessage(request, validator, field));
        return false;
    }
}

上記のサンプルでは「test」が入力された場合のみ正常を返すルールです。

<form-validation>
    <global>
        <validator name="test"
            classname="pkg.ExpanseFieldChecks"
            method="validateTest"
            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.test">
        </validator>
    </global>
</form-validation>

上記の内容をvalidator-rules.xmlに追加すればルール「test」を使用することができます。
「msg」には上記message-resourcesタグで指定したファイルのメッセージコードを指定します。
以上でStrutsにおけるルール拡張の説明を終了します。

関連書籍

Strutsに関連する書籍をいくつか紹介します。