サーバサイド(サーブレット)
Struts 2が提供するバリデーションを利用する場合、当然ながら、その機能を利用することをどこかしらに記述する必要があります。Struts 2ではこの記述の設定は、
- XMLファイルに定義
- アノテーション機能をつかってソースファイルに定義
の2つの方法があります。
XMLファイルでの定義
これは、Struts 1をご存じの方にはおなじみの方法です。ただ、俗に「XML地獄」と呼ばれるように、XMLファイルでの設定は生産性の低下につながることもあり、あまり多くの設定を記述するのは考えものです。
XMLファイルは、バリデーションを行いたいActionクラスと同じディレクトリ階層に「Actionクラス名-validation.xml」、または「Actionクラス名-Action名-validation.xml」という名前で配置します。
今回は、ResearchクラスのResearchConfirmというActionの際に追加しますので、/WEB-INF/src/part2/Research-ResearchConfirm-validation.xmlというファイル名で作成します。
└ /part2 ├ Research.class └ Research-ResearchConfirm-validation.xml
バリデーションの内容は、以下のようになります。
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> <validators> <!-- 1. 名前フィールドの必須入力チェック --> <field name="name"> <field-validator type="requiredstring"> <message>名前を入力してください</message> </field-validator> </field> <!-- 2. メールアドレス入力の有効性判断 --> <field name="email"> <field-validator type="email"> <message>有効なメールアドレスを入力してください</message> </field-validator> </field> <!-- 3. 年齢の範囲チェック --> <field name="age"> <field-validator type="int"> <param name="min">18</param> <param name="max">99</param> <message> ${min}歳以上(${max}歳以下)の方が対象です。(入力値:${age}歳) </message> </field-validator> </field> <!-- 4. 選択肢の必須チェック --> <field name="career"> <field-validator type="required"> <message>選択してください。</message> </field-validator> </field> </validators>
<field>タグで、入力フィールドごとのバリデーション設定を行います。name属性で、フォームの<s:textfield>などで設定したnameの値を指定します。
まず、コメント1.のバリデーション内容を説明しましょう。<field-validator>タグは、入力フィールドの検証を示し、type属性により、どういう検証にするかを指定します。type="requiredstring"は、テキスト文字列が入力されているかどうかの検査で、パラメータとしてトリムを行うかどうかの<param name="trim">が指定可能です。デフォルトは<param name="trim">true</param>となっています。入力がない場合、または入力データの長さが0の場合はエラーということで、<message>タグで指定したメッセージが表示されます。
コメント2.では、type="email"、つまり、入力されたテキストがメールアドレスとして妥当かどうかの判断を行います。
コメント3.は、type="int"、数値としての検証を行います。<param name="min">と<param name="max">で最小値と最大値の範囲を指定します。いずれかの範囲指定、または両方とも省略が可能です。両方省略した場合は数値として変換できるかどうかの検証のみとなります。なお、メッセージ中の${min}、${max}は最小・最大のパラメータ値に置換され、${フィールド名}は入力値に置換されます。
コメント4.は、type="required"、つまりラジオボタンのどれかにチェックがされているかどうかの検証となります。
主なバリデータのタイプと、そのパラメータを以下の表にまとめました。
バリデータのタイプ | 検証内容 | パラメータ |
conversion | 型変換の可否検証 | |
date | Date型(日付)としての検証 | min: 最小(最も古い)日付 |
max:最大(最新)日付 | ||
double | double型としての範囲検証 | minInclusive: 最小値 |
maxInclusive: 最大値 | ||
minExclusive: 最小値(minExclusive値は含まない) | ||
maxExclusive: 最大値(maxExclusiv値は含まない) | ||
メールとしての妥当性検証 | ||
fieldexpression | 条件式(OGNL式)での検証 | |
int | 数値型としての検証 | min: 最小値 |
max: 最大値 | ||
regex | 正規表現での検証 | caseSensitive: 大文字小文字を考慮するかどうか |
trim: トリムするかどうか | ||
required | 必須検証 | |
requiredstring | 文字列の必須入力検証 | trim: トリムするかどうか |
stringlength | 文字列の長さの検証 | trim: トリムするかどうか |
maxLength: 最大の長さ | ||
minLength: 最小の長さ | ||
url | URLとしての妥当性検証 | |
visitor | 外部バリデーションファイルを用いての検証 | context: XMLファイル識別名 |
バリデーションは、ResearchConfirmアクションのconfirm()メソッド実行の前に、Struts 2により行われています。バリデーション定義した中でいずれかにエラーがあった場合は、confirm()メソッドは実行されません。その代わり、Struts 2により、ResearchConfirmアクションの戻り値として、"input"という値が設定されることになっています。"input"は、入力エラーがあることを示す固定の返値です。