4.struts1.x的输入验证
一.使用验证框架
(输入验证时需要用到如下两个jar包commons-validator.jar 与oro.jar.)
注意:要进行框架验证的Form必须继承自ValidatorForm,ValidatorActionForm。以及使用动态的
DynaValidatorForm和DynaValidatorActionForm。其中ValidatorForm与DynaValidatorForm在验证文件的配置时相同,另外两个相同。
前两个匹配action配置中的name,而后两个匹配的是action配置中的path.由此可知两者在使用上的一些局限性。
- 框架的基本配置
Struts的验证框架默认是并不打开的,以插件的形式运行,在使用之前要进行插件注册,注册配置为
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/org/apache/struts/validator/validator-rules.xml,
/WEB-INF/validation.xml" />
</plug-in>
其set-property的property属性的值可以在源码找到,这个配置可以到struts提供的示例程序中去拷。对于不同版本的struts1.x它的validator-rules.xml放置的位置可能并不太一样,这点不能硬搞。 另外validation.xml为验证文件。
- 验证文件基本配置:
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration
"http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd">
<form-validation>
<formset>
<form name="userForm">
<!--
验证文件的配置
-->
<field property="userName" depends="required,maxlength">
<!-- msg的key值为资源文件中键值,name指定这个消息为哪个验证器指定,
因为一个field可以同时指定几个验证器,用逗号分开。
bundle指定使用哪个资源文件,这个值在资源文件配置时被指定为key值。
arg用来代替信息中的点为符,其position确定占位符的位置,key确定占位符的值,若
此值来自资源文件还要指定来自哪个资源文件,用bundle指定。若不是则要显示指出
其resource为false,此时它的key值会直接代替占位符.另外如下所示,它还可以引用定义的变量。
另外arg还有name属性指定它为哪个msg生成占位信息。
-->
<msg key="errors.required" name="required" bundle="information"/>
<msg key="errors.maxlength" name="maxlength" bundle="information"/>
<arg position="0" key="userName" resource="false" />
<arg position="1" key="${var:maxlength}" resource="false"/>
<var>
<!-- 为什么叫maxlength ,可以在这个验证器的实现类中找到 -->
<var-name>maxlength</var-name>
<var-value>10</var-value>
</var>
</field>
<field property="userPwd" depends="required">
<msg key="errors.required" name="required" />
<arg position="0" key="userPwd" resource="false" />
</field>
<!-- 下面的这个验证很有用,可以用来验证两个表单是否相等
它有个texst参数,只有这个值为真时才能通过验证。其写法比较固定。
*this*指本字段,与别的字段比较则它其名字,实事上是form的属性
-->
<field property="reUserPwd" depends="validwhen">
<arg position="0" key="repassword" resource="false"/>
<arg position="1" key="password" resource="false"/>
<msg name="validwhen" key="errors.validwhen"/>
<var>
<var-name>test</var-name>
<var-value>(*this*==userPwd)</var-value>
</var>
</field>
<!--
-->
<field property="birthday" depends="required,date">
<msg key="errors.required" name="required" />
<msg key="errors.typeinvalid" name="date" />
<arg position="0" key="birthday" resource="false" />
<var>
<var-name>datePattern</var-name>
<var-value>YYYY-MM-DD</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
二,重载ActionForm的validate方法
1.这种方法很简单,有一点是往ActionErrors里面加入ActionMessage时ActionMessage的重载构造方法可以确定传递进去的字符串是否来自资源文件以及在资源文件中的键值,若不是来自资源文件则此键值将会被显示,它不能指定这个键值来自哪个资源文件,这要靠页面标签来确定,这种设计明显不些不合理但也很无奈。而ActionErrors的add方法指定这个信息的标识符,即页面上用struts的标签以此标识来显示错误信息。
2.当Validate验证出错时会返回到action指定的input页面。出错的标志为ActionErrors里面是否有ActionMessage.
3.在页面上可以用struts标签得到错误信息。
<html:errors property="username.required" bundle="validateerrors"/>
Property指定在ActionErrors的add方法指定的标识符,bundle指定ActionErrors添加的ActionMessage的键值来自哪个资源文件。
4.要注意框架验证与重载ActionForm的validate方法的验证不能同时使用,若同时存在则只执行validate验证。