エンタープライズ:特集 | 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■検証の種類
|
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.*が使われる。
|
すでに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"/> |
|
ここはやや特殊な記述だ。まず、「resource="false"」と指定することで、リソースからの取得ではなく、key属性は固定された文字列であることを示す。
|
そして、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]