エンタープライズ:特集 2003/11/28 15:30:00 更新


特集:第2回 実用サンプルコードで理解する「Struts」の基礎 (14/15)

validation.xmlファイル内定義で検証値のチェックをする

 StrutsのValidate機能では、入力フォームに入力されたデータを、WEB-INF/フォルダに置かれるvalidation.xmlファイルでの定義と照らし合わせることで、検証値をチェックする。そこで、validation.xmlファイルを、List 14のように編集しよう。

List 14■validation.xmlファイル
1: 〜略〜
2: <form-validation>
3: <formset>
4: <form name="KeijiWriteForm">
5: <field property="username"
6: depends="required,maxlength">
7: <arg0 key="KeijiWriteForm.username"/>
8: <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
9: <var>
10: <var-name>maxlength</var-name>
11: <var-value>255</var-value>
12: </var>
13: </field>
14:
15: <field property="email"
16: depends="maxlength,email">
17: <arg0 key="KeijiWriteForm.email"/>
18: <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
19: <var>
20: <var-name>maxlength</var-name>
21: <var-value>255</var-value>
22: </var>
23: </field>
24:
25: <field property="title"
26: depends="required,maxlength">
27: <arg0 key="KeijiWriteForm.title"/>
28: <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
29: <var>
30: <var-name>maxlength</var-name>
31: <var-value>255</var-value>
32: </var>
33: </field>
34:
35: <field property="msg"
36: depends="required,maxlength">
37: <arg0 key="KeijiWriteForm.msg"/>
38: <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
39: <var>
40: <var-name>maxlength</var-name>
41: <var-value>800</var-value>
42: </var>
43: </field>
44:
45: </form>

46: </formset>
47: 〜略〜
48: </form-validation>

 そして、アプリケーションのリソースとなるapplication.resoucesファイルをList 15のように編集する。

List 15■application.resourcesファイル
1: # -- validator --
2: # 下記の項目は、すでに英文メッセージとして定義されているので日本語に変更しておく
3: errors.invalid={0} が不正です
4: errors.maxlength={0} は {1} 文字以内にしてください
5: errors.minlength={0} は {1} 文字以上にしてください
6: errors.range={0} は {1} と {2}の範囲になければなりません
7: errors.required={0} は必須項目です
8: errors.byte={0} はバイト値でなければなりません
9: errors.date={0} は正しい日付ではありません
10: errors.double={0} は数値でなければなりません
11: errors.float={0} は数値でなければなりません
12: errors.integer={0} は整数値でなければなりません
13: errors.long={0} は整数値でなければなりません
14: errors.short={0} は整数値でなければなりません
15: errors.creditcard={0} は正しいクレジットカード番号ではありません
16: errors.email={0} は、有効なメールアドレスではありません

17:
18: # 以下は追加(どの個所でよい)
19: # -- KeijiWriteForm
20: KeijiWriteForm.username=お名前
21: KeijiWriteForm.email=メールアドレス
23: KeijiWriteForm.title=タイトル
24: KeijiWriteForm.msg=本文

 ここでのポイントは、検証値の定義をフォームごとにform要素で行なう点だ。formset要素は、次のように構成する。

4: <form name="KeijiWriteForm">
5〜44: 〜検証値の定義をするfield要素〜
45: </form>

 form要素のname属性には、検証するフォーム名を指定する。このフォーム名は、struts-config.xmlファイルのform-bean要素で指定したものだ。

 さらにフォームに含まれる入力フィールドのうち、どれをどのように検証するのかは、field要素で決定する。例えば5〜13行目には、次のようにusernameというプロパティを調べる設定をしていることが分かるだろう。

5: <field property="username"
6: depends="required,maxlength">
7: <arg0 key="KeijiWriteForm.username"/>
8: <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>
9: <var>
10: <var-name>maxlength</var-name>
11: <var-value>255</var-value>
12: </var>
13: </field>

 field要素のproperty属性には、調べたいプロパティ名を指定する。ここではusernameプロパティを指定するという意味だ。そしてdepends属性では、どのような種類の検証をするかを指定する。depends属性には、Table 2に示す値を指定できる。

 複数指定することもできる。この場合には、カンマで区切って指定すればよい。ただし、順番に意味があることに注意してほしい。例えば、「depends="required,maxlength"」と指定した場合には、まず最初に、required検証が実行され、その後にmaxlength検証が実行される。それに対し、順序を逆にして「depends="maxlength,required”」とすると、先にmaxlength検証が実行され、その次にrequired検証が実行される意味になる。


検証は、Table 2以外にも、自分で検証方法を拡張することもできる。Table 2に示したものは、標準で用意されているものに過ぎない。


Table 2■検証の種類
検証の種類
内   容
指定パラメータ
利用する標準エラーメッセージ
required 値がnull値でなく、かつ0以上の長さが設定されていることを調べる なし errors.required
requiredif 値がnull値ではないことを調べる。長さ0の文字列は許容する なし errors.required
minlength 長さが、指定された値以上であることを調べる minlength:[調べる最小長] errors.minlength
maxlength 長さが、指定された値以下であることを調べる maxlength:[調べる最大長] errors.maxlength
mask 正規表現に合致することを調べる mask:[調べる正規表現パターン] errors.invalid
byte byteに変換できるか調べる なし errors.byte
short shortに変換できるか調べる なし errors.short
integer intに変換できるか調べる なし errors.integer
long longに変換できるか調べる なし errors.long
float floatに変換できるか調べる なし errors.float
double doubleに変換できるか調べる なし errors.double
date 日付として書式が正しいかどうかを調べる datePatternStrict:[調べる日付パターン] yyyy/MM/dd やyyyy-MM-ddとして指定 errors.date
intRange 指定された範囲のint型に収まることを調べる min:[最小値]、max:[最大値] errors.range
floatRange 指定された範囲のfloat型に収まることを調べる min:[最小値]、max:[最大値] errors.float
creditCard クレジットカード番号であること(ハイフン含まず)を、luhnのアルゴリズムによるチェックデジットを使って調べる なし errors.creditcard
email メールアドレスの書式として正しいかどうかを調べる。正規表現を使って調べるものであり、実在するかどうかまでは調べない なし errors.email

 List 14の6行目では、usernameに対して、requiredとmaxlengthを指定しているので、「未入力でない」ということと「長さが一定以上ではない」ということが調べられる。

5: <field property="username"
6: depends="required,maxlength">

 文字列の長さなどを指定する場合には、幾つかのパラメータが利用される。Table 2に示したように、maxlengthという検証は、最大の長さを指定するため、maxlengthというパラメータを要求する。これらのパラメータは、次に挙げるようvar要素内に記述するものだ。

9: <var>
10: <var-name>maxlength</var-name>
11: <var-value>255</var-value>
12: </var>

 この指定によって、255文字以下という条件付けとなる。そして、検証によって入力エラーが発覚した場合には、ValidateFormクラスは、エラーメッセージをActionErrorsオブジェクトに格納する。この時に使われるエラーメッセージは、リソースの中からTable 2に示したerrors.*が使われる。


field要素内で、msg要素を入れると、標準以外のエラーメッセージを採用することもできる。例えば、<msg name="required" key="myerrormsg.required">とすれば、required検証でエラーが発生した場合、標準のerrors.requiredの代わりに、myerrormsg.requiredが使われるようになる。

 すでにList 15に示したように、errors.requiredは次のように7行目で定義している。

7: errors.required={0} は必須項目です

 この「{0}」は、プレースホルダーの意味だ。実際に埋め込む値は、arg0〜arg3で決定する。例えば「arg0」は、次のようにしている。

7: <arg0 key="KeijiWriteForm.username"/>

 これにより、KeijiWriteForm.usernameというリソース値が埋め込まれる。KeijiWriteForm.usernameは、List 15で次のように定義する。

20: KeijiWriteForm.username=お名前

 ここでusernameプロパティが未入力状態ならば、「お名前は必須項目です」というエラーメッセージが格納されるというわけだ。同様に、usernameプロパティが255文字を超えた際には、error.maxlengthのリソースがエラーメッセージとして利用される。

4: errors.maxlength={0} は {1} 文字以内にしてください

 ここで、「{1}」は次のように定義している。

8: <arg1 name="maxlength" key="${var:maxlength}" resource="false"/>



先のarg0要素と違い、このarg1にはname要素を指定していることに注意しよう。name要素を指定した場合には、このプレースホルダーへの埋め込みが、name属性で指定した検証条件の場合にだけ採用される。つまり、maxlength検証に失敗した際のエラー時にのみ埋め込まれる。先のarg0要素の例のように、name要素を変更すると、すべての検証条件で使われる。

 ここはやや特殊な記述だ。まず、「resource="false"」と指定することで、リソースからの取得ではなく、key属性は固定された文字列であることを示す。


先のarg0に関しても、<arg0 key="KeijiWriteForm.username"/>ではなく、<arg0 key="お名前" resource="false"/>とも書ける。しかし、validation.xmlファイルに日本語を記述することはできないため(\uでエスケープすれば別だが)、実用的ではない。

 そして、key属性で指定している「${var:maxlength}」は、varの中のmaxlength要素を指すという意味だ。ここでは、次のように「255」となっている。

9: <var>
10: <var-name>maxlength</var-name>
11: <var-value>255</var-value>
12: </var>

 これにより、${var:maxlength}は「255」値になるのだ。つまり、8行目では次のように記述しても同じことを意味する。

8: <arg1 name="maxlength" key="255" resource="false"/>

 しかし、上記のように記述すると、あとで許可する最大長を変更しようとした際、arg1要素とvar要素の2つの変更をする必要性がある。面倒だろう。そこで、8行目ではvar要素内のmaxlength要素の値を引っ張るよう指定している。これならば、あとで変更しようとした際にも、var要素だけを変更すれば済むだろう。

 以上の設定によって、もし、usernameプロパティが255文字を超えた場合には、「お名前は255文字以内にしてください」というエラーメッセージがActionErrorsオブジェクトに格納される。ここではusernameプロパティについてのみ説明したが、残るプロパティについても同様だ。

前のページ | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 次のページ

[大澤文孝,ITmedia]