Struts Validator 开发指南

来源:百度文库 编辑:神马文学网 时间:2024/05/01 08:13:29
使Struts支持Validator.. 1
Validator-rules.xml文件.... 2
Validator.xml 文件.... 2
Required Validator.. 3
Mask Validator.. 3
Range Validator.. 4
Maxlength Validator.. 4
Minlength Validator.. 5
Email Validator.. 5
Form Bean的编写.... 5
Struts-config.xml文件的配置.... 5
在JSP页面捕捉错误信息.... 6
捕捉服务端的错误信息... 6
捕捉JavaScript的错误信息... 6
编写扩展Struts Validator校验密码输入.... 7
1.编写一个校验器(Validator),实现对form中两个字段的一致性校验: 7
2.编写validator-rules文件,增加一个自定义校验器的配置: 8
3.编写JSP页面... 9
4.编写validator.xml配置文件: 10
支持Validator
要在Struts项目中使用Validator功能,首先需要配置Struts项目,使其支持Validator框架.Struts通过一个插件(Plugin)来使Struts项目支持Validator.这个Plugin由Struts默认提供,用户也可以自己开发自己的Validator Plugin.Struts默认提供的Plugin为:
org.apache.struts.validator.ValidatorPlugIn.
用户必须在struts-config.xml 文件中配置这个Plugin,才能使Struts项目支持Validator.配置方法比较简单,通过任何文本编辑器打开struts-config.xml 文件,在这个文件的末尾加上下面的代码,重新启动J2EE服务器就可以实现对Validator的支持了.

value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />

在Jbuilder开发环境中可以通过下面的方法使Struts项目支持Validator框架.
1.         在项目管理器中用鼠标右键点击Web项目(在我们的项目中是 WebModule ).
2.         选择菜单的 “Properties…”菜单项.
3.         在弹出的对话框的左边树型结构中选中 “web” 节点.
4.         在右边的 “JSP/Servlet frameworks” 框中勾选 “sturts1.1” 节点以及 “struts” 节点下的 “validation” 子节点.
5.         点击 “OK” 按钮完成配置.
6.         检查 struts-config.xml 文件,可以看到配置文件里已经加入了Validator Plugin.
Validator-rules.xml文件
Validator-rules.xml文件是校验器的定义文件.指定了每一个校验器的基本信息和执行校验的JavaScript代码.Struts默认提供了十四个校验器,这些校验器可以满足我们平时项目开发中碰到的绝大多数的输入校验要求.如果这些校验器不能满足用户的校验要求,那么我们也可以开发自己的校验器.我们项目主就实现了一个校验密码的一致性的Validator.
Struts提供的校验器包括Required Validator ,Requiredif Validator, MinLength Validator , MaxLength Validator , Mask Validator , Byte Validator , Short Validaotr , Integer Validator , Long Validator , Float Validator , Double Validator , Date Validator , Range Validator , IntRange Validator , FloatRange Validator , CrediteCard Validator , Email Validator 等校验器.后面我将讲述一些比较常用的校验器的使用方法.
Validator.xml 文件
Validator.xml 文件用来定义用户需要校验的每一个JSP Form中的每一个字段的校验规则,这个文件是我们在Struts项目开发中使用Validator框架所需要配置的文件.这个文件的根节点是,在根节点下的节点的
子节点就对应了我们在开发JSP文件是所定义的Form标记,也对应这struts-config.xml中的form bean的定义.一个节点由多个节点组成,每个节点的结构大概如下:







minlength
8


secondProperty
password2


其中一个对应于一个Form Bean的一个Field,标记的property属性说明了这个Field对应的Form Bean的Field名称,这个名称要跟struts-config.xml文件中的中定义的名字一致.depends属性说明了这个Field依赖于那些校验器的校验,可以使用多个校验器,各个校验器之间使用逗号隔开.标记说明了当这个Field通不过校验的时候向用户提供的错误信息.name属性指定了对应的校验器,key属性指定了定义在ApplicationResources.properties文件中的错误信息.是传递给校验器的参数.标记定义了参数的名字和参数值.上面的这个例子说明了password字段由Required,Minlength,Twofields校验器进行校验.指定了这个Field不能为空,而且最小长度不能小于8为,并且必须和同一个Form中的另一个名为password2的字段相同.如果用户的输入不能满足这些要求,校验器将会抛出异常.
下面开始将怎么在这个配置文件中配置各个校验器实现对form中的多中类型的field进行校验.
Validator
这个校验器用来校验Form的输入数据不能为空.如果某一个Form 的 Field 依赖于这个校验器,那么如果用户在Form中没有输入这个Field对应的输入数据时,Required校验器将会触发一个Exception,这个Exception的错误信息可以在页面或者服务端被捕捉到.
例子:




上面的例子说明了test字段的校验规则是不能为空,在ApplicationResources.properties中的相应的定义信息可能是下面这样的情况:
Test.testField.displayName =测试字段 #上面在标记中定义的key= “test.testField” 对应这个信息
Test.required={0} 不能为空,请重新输入. #在上面定义的标记对应这个信息
如果Validator校验到用户没有输入test这个字段,就会将test.testField对应的信息作为test.required的参数传递给校验器,如果在JSP页面中捕捉了错误信息,错误信息将会是下面的这个形式:
“测试字段 不能为空,请重新输入”
Validator
Mask Validator校验用户输入的数据是否遵照一定的规则,这个规则由开发者在validator.xml文件中定义.
例子:



mask
^0\d*$


上面的标记说明了这个校验的第二个参数是定义在下面的标记的名为mask的值.的值说明了这个字段必须是以数字0开头,以任意数字字符结尾的一个串.
Validator
这个校验器校验字段是否在一个数字范围内.
例子:






min
1


max
100


Range Validator需要三个参数(arg),第一个参数arg0是指定这个字段的名字,第二个和第三个参数指定范围的最大和最小值,分别的名称是max和min.
Maxlength Validator
Maxlength校验器校验一个字符串的最大长度,它需要两个参数,arg0说明字段的名称,arg1说明最大长度.
例子:





maxlength
8


Minlength Validator
这个校验器类似于上面的Maxlength Validator,参数一样,校验规则也一样,只是作为参数的变量名字为minlength





minlength
8


Validator
这个校验器校验电子邮件字段,当用户输入的电子邮件地址不合法的时候,校验器抛出异常.
例子:





的编写
要使用Struts的Validator框架进行自动校验的Form Bean不能继承自普通的ActionForm,必须继承自ValidatorForm或者ValidatorActionForm.我们项目组都是继承自ValidatorForm.
ValidatorForm根据struts-config.xml文件中的action的name属性为当前form的调用相应的验证器,因此在validator-rules.xml中的元素的名称属性(name)应该与的name属性值相匹配。
ValidatorActionForm使用struts-config.xml中action的path属性,所以path属性的值相应的应该与validator.xml中的Form的name属性匹配。
config.xml文件的配置
要使用Validator框架的自动校验机制,还必须在Struts-config.xml文件中作相应的配置.除了前面已经说明了的配置Validator Plugin意外,还需要对需要校验的form的action进行配置.主要有两个地方需要配置,一个是的input属性,一个是的validate属性.input属性必须指定包含校验Form的jsp页面的路径,以便Struts的校验框架校验失败的时候可以重新导向到原来的页面让用户重新输入.validator属性是一个boolean类型的属性,必须设置为true struts才会启动自动校验机制.
页面捕捉错误信息
Validator的校验机制可以定义在服务端进行校验或者通过Javascript在浏览器端进行校验.这两种不同的方式在JSP页面编写的时候有很大的区别.
要捕捉服务端校验的错误信息比较简单.只需要在JSP页面中嵌入一下的代码就可以在页面中显示错误信息,这些错误信息也可以自定义显示风格.






  • 通过ApplicationResources.properties文件中定义的信息向用户报告错误发生的原因和简单说明.



  • 则是显示具体的由Validator框架产生的错误信息.
    的错误信息
    要捕捉JavaScript产生的错误信息首先要使JSP页面产生Validator生成的Javascript代码,并在用户点击提交按钮的时候让提交按钮触发相应的校验函数.实现方法如下:
    首先要让JSP触发校验函数,使用这样的HTML代码:

    其中action指定这个form对应的action,这个跟普通的form没有区别,onsubmit属性就指定了校验函数,它的规则是: return + 空格 + validator+ ValidatorForm的名字 + (this)
    注意这样的组合规则是不能变的,否则会导致页面错误并不能实现校验功能.还要注意ValidatorForm的名字的第一个字母一定要大写,不管在Struts-congfig.xml文件中的定义是否大写,这里都要把它作为大写字母.
    然后还要在JSP页面中产生可以实现校验的JavaScript代码,这个步骤也很简单,只需要在JSP页面的末尾加上下面一句:

    其中formName的名字要跟struts-config.xml文件中配置的一致,大小写也要一致.staticJavascript为true的时候Validator将使用JavaScript代码进行校验(这些Javascript代码由Struts 的validator框架自动产生,我们只需要配置validator.xml文件),staticJavascript为false的时候validator将使用服务端代码进行校验,这些服务端的校验代码也不需要我们编写.
    alidator校验密码输入
    使用Struts的validator校验页面form中的两个字段是否一致,一般用在校验密码,当用户输入两次密码的时候需要校验用户的两次输入是否一致,如果不一致需要报错.实现这个功能的步骤如下:
    编写一个校验器(Validator),实现对form中两个字段的一致性校验:
    package cn.com.syni.net800114.validator;
    import org.apache.commons.validator.ValidatorUtil;
    import org.apache.commons.validator.Field;
    import org.apache.commons.validator.ValidatorAction;
    import org.apache.commons.validator.GenericValidator;
    import org.apache.struts.action.ActionErrors;
    import org.apache.struts.validator.Resources;
    import javax.servlet.http.HttpServletRequest;
    public class ValidationUtil {
    public static boolean validateTwoFields( Object bean, ValidatorAction va,
    Field field, ActionErrors errors,
    HttpServletRequest request) {
    String value = ValidatorUtil.getValueAsString(bean, field.getProperty());
    String sProperty2 = field.getVarValue("secondProperty");
    String value2 = ValidatorUtil.getValueAsString(bean, sProperty2);
    if (!GenericValidator.isBlankOrNull(value)) {
    try {
    if (!value.equals(value2)) {
    errors.add(field.getKey(),
    Resources.getActionError(request, va, field));
    return false;
    }
    }
    catch (Exception e) {
    errors.add(field.getKey(),
    Resources.getActionError(request, va, field));
    return false;
    }
    }
    return true;
    }
    }
    编写validator-rules文件,增加一个自定义校验器的配置:
    classname="cn.com.syni.net800114.validator.ValidationUtil" method="validateTwoFields"
    methodParams="java.lang.Object,
    org.apache.commons.validator.ValidatorAction,
    org.apache.commons.validator.Field,
    org.apache.struts.action.ActionErrors,
    javax.servlet.http.HttpServletRequest"
    depends="required" msg="errors.twofields">
    function validateTwoFields(form) {
    var bValid = true;
    var focusField = null;
    var i = 0;
    var fields = new Array();
    oTwoFields = new twofields();
    for (x in oTwoFields) {
    var field = form[oTwoFields[x][0]];
    var secondField = form[oTwoFields[x][2]("secondProperty")];
    if (field.type == 'text' ||
    field.type == 'textarea' ||
    field.type == 'select-one' ||
    field.type == 'radio' ||
    field.type == 'password') {
    var value;
    var secondValue;
    // get field's value
    if (field.type == "select-one") {
    var si = field.selectedIndex;
    value = field.options[si].value;
    secondValue = secondField.options[si].value;
    } else {
    value = field.value;
    secondValue = secondField.value;
    }
    if (value != secondValue) {
    if (i == 0) {
    focusField = field;
    }
    fields[i++] = oTwoFields[x][1];
    bValid = false;
    }
    }
    }
    if (fields.length > 0) {
    focusField.focus();
    alert(fields.join('\n'));
    }
    return bValid;
    }]]>


    编写JSP页面
    form中包括要进行自定义校验的字段,这里是两个password类型的input,校验器将校验用户输入的这两个字段是否一致,如果不一致,将通过弹出对话框告诉用户:
    <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <%@ page contentType="text/html; charset=GBK" %>
    Regiestation
















    其中,说明这个窗口需要使用Struts Validator进行校验,action属性指定这个JSP页面对应的Action,onsubmit属性指定了这个页面校验所对应的ActionForm Bean,它的规则是 “return + validator + FormBeanName + (this);”,这里的例子表示这个页面的action是/regiestationAction.do,它对应的Action Form名称为Registation(注意,如果在Struts-config.xml文件中ActionForm的名字为registation的话这里也要把第一个字母变为大写,否则出错.
    最后倒数第二行的标记说明要使用java script进行客户端校验,formName属性指定Action Form的名称,这个名称要跟struts-config.xml文件中的配置一致,严格区分大小写,staticJavascript和dynamicJavascript分别指定是使用静态的还是动态的javascript代码进行校验.
    编写validator.xml配置文件:







    secondProperty
    password2



    这里要注意属性的secondProperty要跟ValidatorUtil.java中的校验方法中的代码一致,否则ValidatorUtil.java不能正确进行校验,属性指定这个校验字段所参照的校验字段,上面的配置代码说明要对form中的password字段进行校验,它必须和另外一个叫做password2的字段一致.
    Action里面应该写的内容:
    public ActionErrors validate(
    ActionMapping mapping,
    HttpServletRequest request) {
    ActionErrors errors = new ActionErrors();
    return super.validate(mapping, request);
    }