![[PukiWiki] [PukiWiki]](image/pukiwiki.png) 
 FrontPage2008/01/20からのアクセス回数 18285
formのvalidation機能をSpring-MVCプラグイン1.1.1に追加しました。 あくまでも、ユーザがvalidation.xmlを編集するためのひな形を提供するという 考えです。
Spring-MVCプラグインの1.1.1のインストールには以下の4ファイルが必要です。
上記の添付ファイルをダウンロードしてください。近々公開用リポジトリを用意する予定です(それまでinstall-fileをご使用ください)。
mvn install:install-file \ -Dfile=./spring-mvc-archetype-1.1.1.jar \ -DgroupId=jp.co.pwv.spring-mvc-archetype \ -DartifactId=spring-mvc-archetype \ -Dversion=1.1.1 \ -DpomFile=./spring-mvc-archetype-1.1.1.pom \ -Dpackaging=jar mvn install:install-file \ -Dfile=./maven-GenMVC-plugin-1.1.1.jar \ -DgroupId=org.apache.maven.plugins \ -DartifactId=maven-GenMVC-plugin \ -Dversion=1.1.1 \ -DpomFile=./maven-GenMVC-plugin-1.1.1.pom \ -Dpackaging=jar
Validation機能追加で追加・変更されたファイルは以下の通りです。
テスト用で追加・変更されたファイルは以下の通りです。
内容は、src/mainのものと同じものです。
validationには、org.springmodulesを使用します。
pom.xmlへの追加は、以下の通りです。
    <dependency>
      <groupId>org.springmodules</groupId>
      <artifactId>spring-modules-validation</artifactId>
      <version>0.8</version>
	  <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>commons-validator</groupId>
      <artifactId>commons-validator</artifactId>
      <version>1.1.4</version>
	  <scope>compile</scope>
    </dependency>
各フォームコントローラでvalidationを有効にするために、validator属性を追加します。
    <bean id="memberController" class="example.test.web.EditMemberController"
          parent="baseMemberController">
....
        <property name="validator" ref="beanValidator"/>
....
    </bean>
各フォームへのValidationは、validation.xmlに定義します。
<form name="member"> <field property="address" depends="required"> <arg0 key="member.address" /> </field> <field property="name" depends="required"> <arg0 key="member.name" /> </field> </form>
ここでは、フォームの各属性を必須(required)として定義しています。 これを適宜変更してください。
validatorが使用する共通ルール、ここではstrutsのvalidation-rules.xmlをルールを使用しています。
エラーメッセージ定義とValidation機能のために、servlet-def.xmlに messageSourceとbeanValidatorを定義します。
    <!-- Message sources -->
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames">
			<list>
				<value>messages</value>
				<value>form-messages</value>
			</list>
		</property>
	</bean>
	
	<!-- Validators -->
	<bean id="beanValidator" class= 
		"org.springmodules.validation.commons.DefaultBeanValidator"> 
	  <property name="validatorFactory" ref="validatorFactory" /> 
	</bean>
	<bean id="validatorFactory" class= 
		"org.springmodules.validation.commons.DefaultValidatorFactory"> 
	  <property name="validationConfigLocations"> 
		<list> 
		  <value>WEB-INF/validator-rules.xml</value> 
		  <value>WEB-INF/validation.xml</value> 
		</list> 
	  </property> 
	</bean>
validator-rulesが使用するエラーメッセージを定義します。
# -- validator errors --
errors.header=
errors.footer=
errors.prefix=<div class="error"> 
errors.suffix=</div><br/>
errors.required={0} is required.
errors.minlength={0} can not be less than {1} characters.
errors.maxlength={0} can not be greater than {1} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be a byte.
errors.short={0} must be a short.
errors.integer={0} must be an integer.
errors.long={0} must be a long.
errors.float={0} must be a float.
errors.double={0} must be a double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is an invalid credit card number.
errors.email={0} is an invalid e-mail address.
各フォームの属性をエラーメッセージで表示するときの名称をform-message.propertiesで定義 します。
# -- form messages -- # -- Member member.address=Member address member.name=Member name
実際にvalidationが正常の動作するかhttp://localhost:8080/test/でaddリンクをクリックして 一部の値をセットしないで、Save Changesボタンを押すと、以下のように属性の横にエラーメッセージを 出力して、入力画面に戻ってきます。
今回は、apache common validatorの機能を使ってvalidationを実装しています。 validator-rulesに定義してあるvalidationルールを以下に示します。
| Validationルール | Validation対象 | 
| byte | フィールドがbyteとして代入できる値を含むか否か | 
| creditCard | LUHNチェックを行い、有効なカード番号文字列か否か | 
| date | フィールドがDateフォーマットに適合する値か否か | 
| double | フィールドがdoubleとして代入できる値を含むか否か | 
| フィールドがemailアドレスとしてふさわしい文字列か否か | |
| float | フィールドがfloatとして代入できる値を含むか否か | 
| floatRange | フィールドの値が指定されたfloat値の範囲に含まれるか否か | 
| intRange | フィールドの値が指定されたint値の範囲に含まれるか否か | 
| integer | フィールドがintegerとして代入できる値を含むか否か | 
| long | フィールドがlongとして代入できる値を含むか否か | 
| mask | フィールドの文字列が指定されたmaskとマッチするか否か | 
| maxlength | フィールドの文字列の数が指定された値を超えないか否か | 
| minlength | フィールドの文字列の数が少なくとも指定された値を満たしているか否か | 
| required | フィールドが空か否か | 
| requiredif | 指定した条件に合致した場合に、フィールドが空か否か | 
| short | フィールドがshortとして代入できる値を含むか否か | 
各ルールの使い方は、http://www.techscore.com/tech/ApacheJakarta/Struts/13.html 詳しく説明されています。
byte, date, double, float, integer, long, shortは、すべて型変換が可能かどうかをチェックするルールです。 使い方はすべて同じで、
<field property="address" depends="required,byte"> <arg0 key="member.address" /> </field>
のようにdepends属性でrequired,byteの様にrequired,の後に型名称を指定します。requiredを付けるのは型変換時のエラーを防ぐためです。
creditCard, email, mask, maxlength, minlengthは文字列をチェックするルールです。
			<field property="address" depends="required,mask">
				<arg0 key="member.address" />
				<var>
					<var-name>mask</var-name>
					<var-value>^[0-9A-Za-z]{2,6}$</var-value>
				</var>
			</field>
<field property="address" depends="maxlength"> <arg0 key="member.address" /> <var> <var-name>maxlength</var-name> <var-value>20</var-value> </var> </field>
intRange, floatRangeは数値の範囲をチェックするルールです。 例
<field property="quantity" depends="required,intRange"> <arg0 key="lineItem.quantity" /> <var> <var-name>min</var-name> <var-value>1</var-value> </var> <var> <var-name>max</var-name> <var-value>10</var-value> </var> </field>
この記事は、
皆様のご意見、ご希望をお待ちしております。