2007 年 5 月 8 日 23 時 46 分

Struts Validator: 独立性の高い検証基盤


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


Struts Validator は、Struts の中核として、
struts-core ライブラリに含まれているのだが、
Validator の検証機能を実際に使うためには、
いくつかのライブラリを lib に追加する必要がある。

・commons-validator-1.3.0.jar
・oro-2.0.8.jar

これらは struts-1.3.5 と一緒に配布されているので、
/WEB-INF/lib にコピーしておくこと。

commons-validator は検証機能を持つ汎用ライブラリ、
oro は、Perl や AWK の正規表現のライブラリだ。
oro は必須ではないが、今回は利用するので追加する。

commons-validator は、XML で記述したルールを使い、
文字列が適合するかどうかを検証する機能を持つ。
このフレームワークは非常に汎用的に作られており、
XML には多彩な記述が可能となっている

Struts Validator はこれを使って値の検証を行い、
検証結果を ActionMessages に統合する機能を持っている。

ValidatorForm は Validator の代表的なクラスで、
ValidatorForm クラスを基底として使うと、
自身の検証用の validate() メソッドを、
XML ファイルを使って自動的に行う ActionForm となる。

つまり、validate メソッドに一切コードを書くことなく、
ActionForm に対して自動的な検証を行うことができるのだ。

さて、この機能を使う場合、以下の準備が必要となる。

1. 検証機能や検証内容を定義した XML ファイルを作る
2. Struts 設定ファイルに XML ファイルを登録する。
3. 検証を行う Bean を ValidatorForm から派生させる。

順に見ていこう。

まず、XML ファイルだ。これが心臓部なので一番ややこしい。
とりあえず、空の XML を用意しておこう。
場所は、/WEB-INF/validation.xml とするのが一般的だ。

========== /WEB-INF/validation.xml ==========
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE form-validation PUBLIC
        "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"
        "http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd">

<form-validation>
</form-validation>
========== end of /WEB-INF/validation.xml ==========

次に、Struts 設定ファイルへの登録。
Struts Validator はプラグインという形で実装されており、
Struts 設定ファイルの <plug-in> 要素で指定することで、
ActionServlet の起動と同時に読み込まれて有効化される。

========== /WEB-INF/struts-config.xml ==========
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts-config PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
        "http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd">

<struts-config>

    <form-beans>
(…省略…)
    </form-beans>

    <action-mappings>
(…省略…)
    </action-mappings>

    <message-resources
            parameter="jp.loafer.test.resources.Messages" />

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

</struts-config>
========== end of /WEB-INF/struts-config.xml ==========

<plug-in> 要素は、<struts-config> の直下で、
厳密な順番が決まっているため、最後の部分となる。

className 属性にはプラグインを提供する FQCN を書く。
Struts Validator の場合、ValidatorPlugIn クラスだ。
このクラスは、Struts の core ライブラリにあるのだが、
プラグインなので、<plug-in> で指定しないと使われない。

<set-property> 要素はプラグイン固有のパラメータを示す。
ValidatorPlugIn では、pathnames プロパティが必須で、
その値として、XML のパスをカンマ区切りで指定する。

通常、Struts Validator 自身が定義している XMLと、
開発者自身が定義する XML の 2 つを使用するが、
XML ファイルはいくつでも指定可能だ。

Struts Validator 自身が定義している検証ルールは、
Struts の core ライブラリの内部にリソースとして含まれ、
org.apache.struts.validator.validator-rules.xml にある。

これをリソースとして読み込めるように、
パッケージ区切りを / に変更した以下のパスを指定する。
/org/apache/struts/validator/validator-rules.xml

このリソースには、検証を行うクラスの参照が
定義されているので必ず取り込んでおく必要がある。

/WEB-INF/validation.xml は、
これから作りこんでいく XML ファイルだ。

そして、最後に、ValidatorForm からの派生だ。
これは非常に簡単である。

========== FilterRuleForm.java ==========
package jp.loafer.test.forms;

import javax.servlet.http.HttpServletRequest;

import jp.loafer.test.beans.FilterRule;

import org.apache.struts.action.ActionMapping;
import org.apache.struts.validator.ValidatorForm;

public class FilterRuleForm extends ValidatorForm {
(…省略…)
}
========== end of FilterRuleForm.java ==========

ActionForm が ValidatorForm になっただけだ。

これで基本的な準備は整った。
まだ XML ファイルが空なので何の検証も行われない。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.