Spring中使用Springmodules的Commons Validator做验证
使用Springmodules的Commons Validator做验证需要两个bean(ValidatorFactory、BeanValidator)及两xml文件(validator-rules.xml、validation.xml)的支持,ValidatorFactory用于制造BeanValidator,后者则是在程序中执行校验的控制bean。validator-rules.xml中定义了各种验证的规则,如字段不为空,字段输入值必须为整数等等,在这里可以自己扩展验证规则。而validation.xml中则定义了那些bean及bean中的哪些属性字段需要验证,使用哪些验证规则。validate 分为两级验证,客户端验证(javascript)和服务器端验证。以下是使用validate的步骤:
1. 在配置<action>-servlet.xml文件中声明 ValidatorFactory 和 BeanValidator:<!-- validation -->
<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>
<bean id="beanValidator" class="org.springmodules.validation.commons.DefaultBeanValidator">
<property name="validatorFactory" ref="validatorFactory"/>
</bean>
① 声明validatoFactory 这里我们使用DefaultValidatorFactory
② 定义其validationConfigLocations属性,将validator-rules.xml和validation.xml传入
③ 声明beanValidator 这里我们使用DefaultBeanValidator
④ 在其属性中指明要使用的validatorFactory 。这里我们使用刚刚定义的validatorFactory
这里需要注意的是随着Springmodules版本的不同,DefaultValidatorFactory和DefaultBeanValidator的包路径有可能不同。
2. 在需要进行验证的controller(即要使用form表单或者command的controller)中声明validate。
<bean id="compoundMainController" class="com.founder.action.CompoundMainController">
<property name="formView">
<value>regcompound</value>
</property>
<property name="successView">
<value>regcompound</value>
</property>
<property name=" commandClass">
<value>com.founder.domain.ChemicalInfo</value>
</property>
<property name=" commandName">
<value>chemicalInfo</value>
</property>
<property name="compoundService">
<ref bean="compoundService"/>
</property>
<property name="validator" ref="beanValidator" />
</bean>
① commandName 用于指明需要验证的 command的名字,这个名字必须和 validation.xml中<form name=" xxxxx "> 所写的名字保持一致。
② commandClass用于指定这个command的类型。其必须与你jsp提交的form最后形成的command类型相一致。
③ 声明该controller使用validator,这里将我们刚刚定义的beanValidator传入进去。
3. 在 validation.xml文件中,定义你要校验的 formbean(或者说是 command) ,定义这个 bean中有哪几个 field需要验证,使用何种规则验证。( 注意:这里定义的 form name 必须和前面 controller 中定义的 commandName 保持一致)以下是几种常用的验证示例:
<form name="chemicalInfo">
<field property="saltForm" depends="maxlength,required">
<arg0 key="chemicalInfo.saltForm.displayName" />
<arg1 name="maxlength" key="${var:maxlength}" resource="false" />
<var>
<var-name>maxlength</var-name>
<var-value>30</var-value>
</var>
</field>
<field property="saltNumber" depends="required">
<arg0 key="chemicalInfo.saltNumber.displayName" />
</field>
</form>
而validator-rules.xml默认模板可以从下载的spring-modules-0.9.zip(当然你下的版本可能不同)里面的可以找到。
4. 在jsp页面中定义错误信息显示语句:
<spring:bindpath="chemicalInfo.*"> -----①
<c:iftest="${not empty status.errorMessages}">
<div class="error">
<c:forEachvar="error" items="${status.errorMessages}">
<c:outvalue="${error}"escapeXml="false"/><br/>
</c:forEach>
</div>
</c:if>
</spring:bind>
① 这里的path必须要与传入该 jsp的bean的名字一样。如传入该jsp的数据bean叫chemicalInfo,path就应该写为chemicalInfo.*。
5 . 使客户端产生 javascript 代码:
<v:javascriptformName="chemicalInfo" -----①
staticJavascript="false" xhtml="true" cdata="false"/>
<script type="text/javascript" src="<c:urlvalue="scripts/validator.jsp"/>"></script>
① v:javascript标签是spring的标签,定义在spring-commons-validator.tld 。其中formName必须与validation.xml中form的name保持一致。