検証ルールは <validator> 要素で定義されている。
独自のルールを作る場合は、自前で用意しなければならない。
そこで、既存のルールを参考にしながら調べてみよう。

とりあえず、required ルールの設定を眺めてみる。

        <validator name="required"
                   classname="org.apache.struts.validator.FieldChecks"
                   method="validateRequired"
                   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"
                   msg="errors.required"/>

name 属性は、ルールの名前。これは明らかだ。
msg 属性は、エラーメッセージとして使われる、
メッセージリソースのキーの既定値となる。

classname 属性が、検証を実行するクラスの FQCN で、
method 属性が、そのクラスのメソッド名となる。

methodParams 属性は、メソッドに渡す引数の型である。
カンマで区切って、引数の FQCN を並べる。

required ルールの場合、検証処理の実体は、
org.apache.struts.validator.FieldChecks クラスの、
validateRequired メソッドであり、
その引数は 6 つということになる。

required ルールの場合、各引数には以下の値が渡される。

・java.lang.Object
    検証対象の Form Beam
・org.apache.commons.validator.ValidatorAction
    ルール自身の <validator> 要素の設定を含むクラス
・org.apache.commons.validator.Field
    制約内容を表す <field> 要素の設定を含むクラス
・org.apache.struts.action.ActionMessages
    検証結果を格納する Struts の ActionMessages。
・org.apache.commons.validator.Validator
    検証メソッドを呼び出したクラス
・javax.servlet.http.HttpServletRequest
    現在の HTTP 要求を含む HttpServletRequest。

validateRequired メソッドはこの値を使って、
検証処理を実行して結果を返しているのである。