#freeze
[[FrontPage]]2008/01/20からのアクセス回数 &counter;

#contents

* Spring-MVCプラグイン機能追加(Validation) [#ifa6ea9b]
formのvalidation機能をSpring-MVCプラグイン1.1.1に追加しました。
あくまでも、ユーザがvalidation.xmlを編集するためのひな形を提供するという
考えです。

** Spring-MVCプラグイン1.1.1のインストール [#v71547b3]
Spring-MVCプラグインの1.1.1のインストールには以下の4ファイルが必要です。
- archeTypeプラグインjarファイル
#ref(spring-mvc-archetype-1.1.1.jar);
- archeTypeプラグインpomファイル
#ref(spring-mvc-archetype-1.1.1.pom);
- GenMVCプラグインjarファイル
#ref(maven-GenMVC-plugin-1.1.1.jar);
- GenMVCプラグインpomファイル
#ref(maven-GenMVC-plugin-1.1.1.pom);

上記の添付ファイルをダウンロードしてください。近々公開用リポジトリを用意する予定です(それまでinstall-fileをご使用ください)。

- 次に以下のコマンドを実行してください。
#pre{{
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で追加・変更されたファイル [#xbdc64f0]
Validation機能追加で追加・変更されたファイルは以下の通りです。
- pom.xml(変更)
- src/main/resources/form-message.properties(追加)
- src/main/resources/message.properties(追加)
- src/main/webapp/WEB-INF/servlet-def.xml(変更)
- src/main/webapp/WEB-INF/servlet-stub.xml(変更)
- src/main/webapp/WEB-INF/validation.xml(追加)
- src/main/webapp/WEB-INF/validator-rules.xml(追加)

テスト用で追加・変更されたファイルは以下の通りです。
- src/test/resources/form-message.properties(追加)
- src/test/resources/message.properties(追加)
- src/test/WEB-INF/servlet-def.xml(変更)
- src/test/WEB-INF/servlet-stub.xml(変更)
- src/test/WEB-INF/validation.xml(追加)
- src/test/WEB-INF/validator-rules.xml(追加)

内容は、src/mainのものと同じものです。

*** pom.xml [#i965d39f]
validationには、org.springmodulesを使用します。

pom.xmlへの追加は、以下の通りです。
#pre{{
    <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>
}}

*** servlet-stub.xml [#s2b58751]
各フォームコントローラでvalidationを有効にするために、validator属性を追加します。
#pre{{
    <bean id="memberController" class="example.test.web.EditMemberController"
          parent="baseMemberController">
....
        <property name="validator" ref="beanValidator"/>
....
    </bean>
}}

*** validation.xml(自動生成される) [#t4f2f1e6]
各フォームへのValidationは、validation.xmlに定義します。
#pre{{
		<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-rules.xml [#i4568220]
validatorが使用する共通ルール、ここではstrutsのvalidation-rules.xmlをルールを使用しています。

*** servlet-def.xml [#g5fc3918]
エラーメッセージ定義とValidation機能のために、servlet-def.xmlに
messageSourceとbeanValidatorを定義します。

#pre{{
    <!-- 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>
}}


*** message.properties [#e89d99eb]
validator-rulesが使用するエラーメッセージを定義します。
#pre{{
# -- 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(自動生成される) [#zf647b09]
各フォームの属性をエラーメッセージで表示するときの名称をform-message.propertiesで定義
します。
#pre{{
# -- form messages --
# -- Member
member.address=Member address
member.name=Member name
}}

** Validationの動作確認 [#jb8e11fa]
実際にvalidationが正常の動作するかhttp://localhost:8080/test/でaddリンクをクリックして
一部の値をセットしないで、Save Changesボタンを押すと、以下のように属性の横にエラーメッセージを
出力して、入力画面に戻ってきます。
#ref(validation.jpg);

** validation.xmlで使用できるvalidationルール [#i421355d]
今回は、apache common validatorの機能を使ってvalidationを実装しています。
validator-rulesに定義してあるvalidationルールを以下に示します。

|CENTER: Validationルール |CENTER: Validation対象 |
| byte | フィールドがbyteとして代入できる値を含むか否か |
| creditCard | LUHNチェックを行い、有効なカード番号文字列か否か |
| date | フィールドがDateフォーマットに適合する値か否か |
| double | フィールドがdoubleとして代入できる値を含むか否か |
| email | フィールドが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 詳しく説明されています。

*** 型変換をチェックする [#z0f6fa3c]
byte, date, double, float, integer, long, shortは、すべて型変換が可能かどうかをチェックするルールです。
使い方はすべて同じで、
#pre{{
			<field property="address" depends="required,byte">
				<arg0 key="member.address" />
			</field>
}}
のようにdepends属性でrequired,byteの様にrequired,の後に型名称を指定します。requiredを付けるのは型変換時のエラーを防ぐためです。

*** 文字列をチェックする [#x2c952e3]
creditCard, email, mask, maxlength, minlengthは文字列をチェックするルールです。

- creditCard, emailは引数が不要です。
- maskはパターンを示すvarタグが必要です。
例
#pre{{
			<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>
}}
- maxlength, minlenghtは、長さを指定するvarタグが必要です。
例
#pre{{
			<field property="address" depends="maxlength">
				<arg0 key="member.address" />
				<var>
					<var-name>maxlength</var-name>
					<var-value>20</var-value>
				</var>
			</field>
}}

*** 数値の範囲をチェックする [#hb8cd45c]
intRange, floatRangeは数値の範囲をチェックするルールです。
例
#pre{{
			<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>
}}

** コメント [#l5b03105]
この記事は、

#vote(おもしろかった[9],そうでもない[2],わかりずらい[9])
#vote(おもしろかった[9],そうでもない[2],わかりずらい[10])

皆様のご意見、ご希望をお待ちしております。

#comment_kcaptcha

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc