ここでは、オブジェクトの書式チェックをするSpring Modulesを見ていきます。
機能は、StrutsのValidationの機能とほぼ同様です。
実は裏で使っている機能はStrutsもSpring Modulesも同じなんです。
でも、URLのチェックがないことや日付型の設定方法が違うなど、Strutsと違うところもあるようなので注意です!
Strutsを使ったことない方もいるかと思うので、具体的に見ていきましょう!
【ダウンロード】
まずは、jarファイルをダウンロードしましょう!
https://springmodules.dev.java.net/
現状の最新版は、0.9です。
依存ファイルもダウンロードしておきましょう!
(バージョンは最新のものでも動作すればいいと思うので動かしながら試してみてください!)
【設定】
まず必要なファイルを確認しておきましょう。
①/WEB-INF/validator.xml
②/WEB-INF/validator-rules.xml
③/src/messages_ja.properties
spring-modules-0.9-all.jarなどのライブラリはすべて、libに入れておきましょう。
①は、自分で設定するファイルで、オブジェクトの書式を記述します。
②は、ダウンロードしたファイルの中のsampleからコピーすればよいでしょう。
例えば、spring-modules-validation-commons-samples-src\webapp\WEB-INF\ とか。
このファイルの役割は、書式チェックのルールを決めるものです。
例えば、"required"が必須を表し、エラーになった場合はメッセージリソースの"errors.required"の
エラーメッセージを出力する、などのルールです。
あとで、具体例をみてみましょう!
③メッセージリソースです。
以下のキーを設定しておけばとりあえずそれなに動くと思います。
errors.required={0}は必須です。
errors.requiredAtLeast={0}はいずれか必須です。
errors.maxlength={0}は{1}文字以内で入力してください。
errors.minlength={0}は{1}文字以上で入力してください。
errors.integer={0}は整数で入力してください。
errors.float={0}は小数です。
errors.double={0}は小数です。
errors.date={0}は正しい日付ではありません。
errors.range={0}は{1}と{2}の範囲でないといけません。
errors.creditcard={0}は不正なクレジットカード番号です。
errors.email={0}は不正なメールアドレスです。
errors.invalid={0}は不正です。
【具体的な例(validator.xml)】
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_1.dtd
">
<form-validation>
<formset>
<form name="member">
<!-- 必須チェック -->
<field property="id" depends="required">
<arg0 key="ID" resource="false" />
</field>
<!-- 桁数チェック -->
<field property="age" depends="maxlength, integer">
<arg0 key="年齢" resource="false" />
<arg1 key="${var:maxlength}" resource="false" />
<var>
<var-name>maxlength</var-name>
<var-value>2</var-value>
</var>
</field>
<!-- 日付フォーマットチェック -->
<field property="regDate" depends="date">
<arg0 key="登録日" />
<var>
<var-name>datePattern</var-name>
<var-value>yyyy/MM/dd</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
上記をみると
<field property="name" depends="required">
と記述してます。
このrequiredがvalidator-rules.xmlに定義されています。
単純にどのメソッドを使用してチェックするか?が記述されているだけなので
自作で作ったチェックのメソッドも簡単に追加できます!
※上記では、require, date などを使っています。
その他にも、email, byteや、validwhenのように自由に条件をつけられるものもあります!
【Springファイル上の設定(/WEB-INF/applicationContext-other.xml)】
記述は、test-servlet.xmlなどのservlet系のSpring設定ファイルに記述してもよいのですが、
個人的には別ファイルにしておいた方がいいかと思っています。
というのは、junitを使用してテストするときに実行時のカレントパスが違うのでvalidator.xmlなどを見つけられないからです。
別ファイルにしておき、junit実行時はそのファイルだけ他のファイルを使用するようにするといいでしょう。
<!--validator 用の設定 -->
<bean id="validatorFactory"
class="org.springmodules.validation.commons.DefaultValidatorFactory">
<property name="validationConfigLocations">
<list>
<value>/WEB-INF/validator-rules.xml</value>
<value>/WEB-INF/validator.xml</value>
</list>
</property>
</bean>
<bean id="beanValidator"
class="org.springmodules.validation.commons.DefaultBeanValidator">
<property name="validatorFactory" ref="validatorFactory"/>
</bean>
<上記ファイルのためのweb.xmlの設定>
※上記ファイルを追加したら、WEB読み込むようにweb.xmlにファイル名を追記してください。
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml /WEB-INF/applicationContext-other.xml</param-value>
</context-param>
【Spring-servletファイルの設定(/WEB-INF/xxx-servlet.xml)】
servlet用のSpring設定ファイルにメッセージリソース用の設定をします。
SpringModulesでは基本的には、エラーメッセージをメッセージリソースに記述するので、
メッセージリソースを読み込めるようにしておかなければいけません。
その設定が以下の記述です。
<!--
メッセージリソースの設定。
bean名はmessageSourceにする必要があります。
-->
<bean id="messageSource"
class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages"/>
</bean>
あとは、SimpleFormControllerなどのvalidatorに上記で設定したbeanValidatorを設定するだけです!
簡単ですね!
<記述例>
<!-- サンプルController -->
<bean id="validatorTestInputController" class="org.springframework.web.servlet.mvc.SimpleFormController">
<property name="commandClass" value="business.domain.CmdTest" />
<property name="formView" value="/WEB-INF/jsp/input.jsp" />
<property name="successView" value="/WEB-INF/jsp/output.jsp" />
<property name="validator" ref="beanValidator"/>
</bean>
SimpleFormControllerやvalidatorが良く分からない人は、こちらの記事を見てみてくださいね。
参考:
・Strutsのように設定ファイルでパラメタの妥当性チェックをするには?
・日本語の妥当性チェックを追加するには? (独自のチェックの追加の仕方)
・SpringMVCを使用してWEBを作るには? (実践編) : (パラメタとオブジェクトのバインドの方法)
SpringModulesの入力チェックを知る (ITPro)