連載
» 2004年05月28日 00時00分 公開

Strutsを使うWebアプリケーション構築術(5):Validatorによる妥当性検証の実現(前編) (2/2)

[山田祥寛,@IT]
前のページへ 1|2       

プロパティファイルを定義する

 次に、エラー発生時に使用するプロパティファイルを用意します。前述したように、StrutsのValidatorプラグインではエラーメッセージをプロパティファイル(「.properties」)上で管理しています。プロパティファイルは、「キー名=値」の形式で構成される単純なテキストファイルで、以下のような内容からなります。

ApplicationResources.properties.sjis
errors.required ={0}はかならず入力してください。
errors.maxlength={0}は{1}文字以内で入力してください。
errors.integer ={0}は整数で入力してください。
errors.invalid ={0}は正しい形式で入力してください。

注意:ファイル名の拡張子を「.sjis」としているのは、後述するように、このファイルを後から変換するためです。アプリケーション上に配置するのは、エスケープ変換した後のファイルなので、エスケープの前後でファイル名が重複しないよう、ここでは仮に「.sjis」という拡張子を付加しています。もちろん、これは一時ファイル的な処理なので、拡張子は自由に決めて構いません。

 Validatorプラグインでは、エラーメッセージのキー名は事前に決められているということに注意してください。このエラーメッセージのキー名については、Validatorプラグインが標準で提供する検証の種類を説明する、次項の「validation.xmlを定義する」で併せて紹介しますので、ここではプロパティファイルの概要をよくつかんでおいてください。

 プロパティ値に含まれる{0}、{1}のような文字列は、後から動的に渡されるパラメータのプレイスホルダ(置き場所)です。例えば、「{0}はかならず入力してください。」という文字列に、「タイトル」という文字列がパラメータとして与えられると、最終的に「タイトルはかならず入力してください。」というエラーメッセージが生成されるというわけです。このパラメータの指定方法についても、次項の「validation.xmlを定義する」であらためて紹介します。なお、プレイスホルダは、{0}から{3}まで最大4個を指定できます。

 プロパティファイルに日本語が含まれている場合は、必ず「Unicodeエスケープ」と呼ばれる処理を行う必要があります。この処理を適切に行っていないと、Strutsアプリケーション上では、日本語(2bytes文字)部分が文字化けを起こしてしまいます。Unicodeエスケープは、コマンドプロンプトからnative2asciiコマンドを使用することで行うことができます。使用法は、以下のとおり、native2asciiコマンドのすぐ後ろに変換元のファイル名、その次に変換後のファイル名を指定します。

native2asciiコマンドによるUnicodeエスケープ処理
> native2ascii ApplicationResources.properties.sjis ApplicationResources.properties

 Unicodeエスケープを実行すると、ファイルの中身は以下のようになります。

ApplicationResources.properties
errors.required ={0}\u306f\u304b\u306a\u3089\u305a\u5165\u529b\u3057
\u3066\u304f\u3060\u3055\u3044\u3002
errors.maxlength={0}\u306f{1}\u6587\u5b57\u4ee5\u5185\u3067\u5165\u5
29b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
errors.integer ={0}\u306f\u6574\u6570\u3067\u5165\u529b\u3057\u3066
\u304f\u3060\u3055\u3044\u3002
errors.invalid ={0}\u306f\u6b63\u3057\u3044\u5f62\u5f0f\u3067\u5165
\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002

 アプリケーション上には、変換前のプロパティファイル「ApplicationResources.properties.sjis」ではなく、変換後のプロパティファイル「ApplicationResources.properties」を配置するようにしてください(変換が終わったら、ApplicationResources.properties.sjisは必要ありません)。

validation.xmlを定義する

 Validatorプラグインは、個々のフォーム要素に対して適用する検証の種類、検証時に必要なパラメータ、エラーメッセージなどのマッピングを、すべてvalidation.xml上で定義します。

validation.xml
<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE form-validation PUBLIC
  "-//Apache Software Foundation//
DTD Commons Validator Rules Configuration 1.0//EN"
 "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>
  <formset>
    <form name="BookUpdateForm">
      <field property="isbn" depends="required,mask">
        <arg0 key="ISBN番号" resource="false" />
        <var>
          <var-name>mask</var-name>
          <var-value>[0-9]{1,5}-[0-9]{1,7}-[0-9]{1,7}-[0-9A-Z]{1}
</var-value>
        </var>
      </field>
      <field property="title" depends="required,maxlength">
        <arg0 key="タイトル" resource="false" />
        <arg1 name="maxlength" key="${var:maxlength}" 
resource="false" />
        <var>
          <var-name>maxlength</var-name>
          <var-value>100</var-value>
        </var>
      </field>
      <field property="author" depends="required,maxlength">
        <arg0 key="著者名" resource="false" />
        <arg1 name="maxlength" key="${var:maxlength}" 
resource="false" />
        <var>
          <var-name>maxlength</var-name>
          <var-value>20</var-value>
        </var>
      </field>
      <field property="price" depends="required,integer">
        <arg0 key="価格" resource="false" />
      </field>
      <field property="publish" depends="required,maxlength">
        <arg0 key="出版社" resource="false" />
        <arg1 name="maxlength" key="${var:maxlength}" 
resource="false" />
        <var>
          <var-name>maxlength</var-name>
          <var-value>100</var-value>
        </var>
      </field>
      <field property="published" depends="required">
        <arg0 key="配本日" resource="false" />
      </field>
    </form>
  </formset>
</form-validation>

■validation.xmlのスケルトン

 前述のvalidation.xmlにおいて、スケルトン(骨格)となるのは以下の部分です。

validation.xml(一部)
<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE form-validation PUBLIC
  "-//Apache Software Foundation//
DTD Commons Validator Rules Configuration 1.0//EN"
 "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>
  <formset>
    <form name="アクションフォームBeansの論理名">
      <!--検証内容の定義-->
    </form>
    <!--<form>要素を繰り返し記述-->
  </formset>
</form-validation>

 検証内容の定義は、formset要素配下に、アクションフォームBeansの単位ごとに記述します。今回のサンプルでは、まだ扱っているアクションフォームBeansが1つしかないため、form要素も1つだけですが、ページの追加に伴ってアクションフォームBeansも増えていくはずです。その場合は、formset要素のform子要素を追加していきます。なお、form要素のname属性は、struts-config.xmlのform-bean要素で指定された論理名を指定します(アクションフォームBeansのクラス名ではないので注意してください)。

■validation.xmlの個別定義部分

 それでは、個々の検証設定について説明していきます。form要素直下のfield要素が、フォーム内の個々のフィールドに対する検証設定を表します。例えば、以下の部分に注目してみましょう。

validation.xml(一部)
<field property="title" depends="required,maxlength">
  <arg0 key="タイトル" resource="false" />
  <arg1 name="maxlength" key="${var:maxlength}" resource="false" />
  <var>
    <var-name>maxlength</var-name>
    <var-value>100</var-value>
  </var>
</field>

 この例では、属性値titleに対して、必須チェック(required)と文字列長チェック(maxlength)を行います。depends属性には、あらかじめvalidator-rules.xmlで用意された検証名をカンマ区切りで指定します。Validatorプラグインで利用可能な検証の種類は、以下のとおりです。また、前述したように、それぞれの検証名に対応するエラーメッセージのキー名も決まっている点に注目してください。

Validatorプラグインが標準実装する主な検証の種類
depends属性値 チェックの種類 キー名 エラーメッセージ(例)
required 必須チェック errors.required {0}はかならず入力してください
minlength 最小長チェック errors.minlength {0}は{1}文字以上で入力してください
maxlength 最大長チェック errors.maxlength {0}は{1}文字以内で入力してください
mask 正規表現チェック errors.invalid {0}は正しい形式で入力してください
byte Byte型チェック errors.byte {0}はbyte型で入力してください
short Short型チェック errors.short {0}はshort型で入力してください
integer Integer型チェック errors.integer {0}はint型で入力してください
long Long型チェック errors.long {0}はLong型で入力してください
float Float型チェック errors.float {0}はFloat型で入力してください
double Double型チェック errors.double {0}はDouble型で入力してください
date 日付型チェック errors.date {0}は日付型で入力してください
range 範囲チェック errors.range {0}は{1}以上{2}以下の範囲で入力してください
intRange 範囲チェック(整数) errors.range {0}は{1}以上{2}以下の範囲で入力してください
floatRange 範囲チェック(小数) errors.range {0}は{1}以上{2}以下の範囲で入力してください
email E-Mailフォーマットチェック errors.email {0}は正しい形式で入力してください

 あらかじめ用意されたプレイスホルダ付きのエラーメッセージに対して、個々にパラメータを設定するのがargN要素の役割です。プレイスホルダに合わせてarg0からarg3要素まで使用できます。

 name属性には、そのパラメータがどのエラーメッセージに対して適用されるかを検証名で指定します(省略時にはすべてのメッセージに対して適用)。例えば、name属性に“maxlength”と指定した場合には、検証名maxlengthに対応するエラーメッセージ“errors.maxlength”に対してパラメータが引き渡されます。

 key属性には、「パラメータ値そのもの」、もしくはパラメータ値として引用するための「プロパティファイルのキー名」を指定します。ただし、プロパティファイルを引用する場合には、resource属性値を“true”に設定しておく必要があります(“false”に設定した場合には、指定値は固定値と見なされます)。また、${var:XXXXX}のように記述すると、次に説明するvar要素で指定した変数値を引用することもできます。それぞれの場合についての簡単な例を以下に示します。

key属性値とresource属性値の違いによる結果の変化
コード セットされる内容
<arg1 name="maxlength" key="100" resource="false" /> 指定値“100”をそのままセット
<arg1 name="maxlength" key="${var:maxlength}" resource="false" /> var要素で定義された変数maxlengthの値をセット
<arg1 name="maxlength" key="maxlength.max" resource="true" /> プロパティファイルからmaxlength.maxの値をセット

 最後はvar要素です。var要素は、検証時に必要なパラメータ情報を定義します。検証時に必要なパラメータとは、例えば、文字列長チェック時の最大文字数などです。var要素に、var-name要素(パラメータ名)とvar-value要素(パラメータ値)のセットで記述することができます。以下の表に、検証単位ごとに必要なパラメータをまとめておきます。なお、ここで明記されていない検証名には、特別なパラメータは必要ありません。

検証方法と必要なパラメータ
depends属性 必要なパラメータ
minlength minLength
maxlength maxLength
mask mask
range max,min
intRange max,min
floatRange max,min
date datePattern(datePatternStrict)

 今回は、まずValidatorプラグインを利用するための環境設定、準備について紹介しました。次回は、これを基に書籍登録・更新アプリケーションに検証機能を組み込んでいきます。どうぞお楽しみに。


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

編集部からのお知らせ

8月8日10時30分〜16時30分の間、システムメンテナンスのため記事の一部表示や資料のダウンロードができなくなります。ご理解のほどよろしくお願いいたします。

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。