Struts(23)校验器

来源:互联网 发布:tcp端口被防火墙阻塞 编辑:程序博客网 时间:2024/05/21 06:33

一.手动输入完成校验
1.普通的处理方式:只需要在action中重写validate()方法
2.一个action对应多个逻辑处理方法:指定校验摸个特定方法的方式:
重写validateXxxx()方法。Eg:如果,只校验login方法,则只需重写validateLogin().

二.输入校验流程:
1. 类型转换器负责对字符串的请求参数执行类型转换。并将这些值设置成Action的属性值。
2. 转换过程中若出现异常,则将异常信息保存到ActionContext中,conversionError拦截器将其封装到fieldError中。
3. 通过反射调用validateXxx()方法。
4. 调用validate().
5. 如果未出现异常,则转入用户请求的处理方法,如果出现异常,则转入inout视图所指定的视图资源(所以,对于验证的方法,必须要在配置文件中为其指定input)。
三.基于验证框架的输入校验
1. 编写校验配置文件:命名规则:action类名-validatin.xml.
2. 一个action对应多个逻辑处理方法:指定校验摸个特定方法的方式:
action类名-name属性名-validatin.xml.(name属性名:在strtus配置文件中的)
3. 配置文件存放位置:放在与Action相同的文件夹内。
4. 验证规则:先加载action类名-validatin.xml,然后加载action类名-name属性名-validatin.xml文件。
5. 校验器的配置风格:两种:字段校验器,非字段校验器。
字段校验器配置格式:
<field name="被校验的字段">
<field-validator type="校验器名">
<!--此处需要为不同校验器指定数量不等的校验规则-->
<param name="参数名">参数值</param>
....................
<!--校验失败后的提示信息,其中key指定国际化信息的key-->
<message key="I18Nkey">校验失败后的提示信息</message>
<!--校验失败后的提示信息:建议用getText("I18Nkey"),否则可能出现Freemarker template Error-->
</field-vallidator>
<!-- 如果校验字段满足多个规则,下面可以配置多个校验器-->
</field>


非字段校验器配置格式:
<validator type="校验器名">
<param name="fieldName">需要被校验的字段</param>
<!--此处需要为不同校验器指定数量不等的校验规则-->
<param name="参数名">参数值</param>
<!--校验失败后的提示信息,其中key指定国际化信息的key-->
<message key="I18Nkey">校验失败后的提示信息</message>
<!--校验失败后的提示信息:建议用getText("I18Nkey"),否则可能出现Freemarker template Error-->
</validator>


非字段校验:先指定校验器:由谁来校验,来校验谁!
字段校验器:先指定校验的属性:我来校验谁,由谁来校验!

6. 校验器:struts2提供了大量的内置校验器:你可以在xwork-core-2.1.6.jar的com.opensymphony.xwork2.validator.validators下找到如下配置文件:default.xml.里面列出了所有的内置校验器。

----------------------------------------------------------

struts2表单验证里field-validator type值:

int 整数;
double 实数;
date 日期;
expression 两数的关系比较;
email Email地址;
url
visitor
conversion
regex 正则表达式验证;
required 是否为空;
requiredstring 必须字符;
stringlength 输入字符长度限制;

url web地址

visitor 访问

conversion 转换

-------------------------------------------------------------


<validators>
<!—必填校验器 -->
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<!—必填字符串校验器-->
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<!-- 整数校验器 -->
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<!-- -->
<validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
<validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<!-- 日期校验器 -->
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<!-- 表达式校验器 -->
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<!-- 字段表达式校验器 -->
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<!-- 邮件校验器 -->
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<!-- 网址校验器 -->
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<!-- 转换器校验器 -->
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<!-- 字符串长度校验器 -->
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<!-- 正则表达式校验器 -->
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
这些校验器已经可以满足大多数的验证需求,如果还需要特殊的要求,建议直接采用java代码搞定,除非你有很多地方都要用到,此时你可以自定义一个校验器。


四.校验器的执行顺序
1. 所有非字段校验风格的校验器优先于字段校验风格的校验器;
2. 所有非字段校验风格的校验器中,排在前面的会先执行;
3. 所有字段校验风格的校验器,排在前面的会先执行;



五.校验器的短路原则
1. 所有非字段检验器时最优先执行的,如果某个非字段校验器校验失败了,则该字段上的所有字段校验器都不会获得校验机会;
2. 非字段校验校验失败,不会阻止其他非字段校验执行;
3. 如果一个字段校验器校验失败后,则该字段下且排在该校验失败后的检验器之后的其他字段校验器不会获得校验机会;
4. 字段校验器永远不会阻止非字段校验器的执行!

六.短路校验器

短路校验器:只需在或元素中添加short-circuit=”true”属性。
注:在struts2.1.6版本,已经支持客户端的短路校验。
七.客户端的校验:
在中添加validate=”true”.

Struts2提供了客户端校验与服务端校验。这里只是做个简易的总结。

1.)服务端校验:
当程序流程进入到Action类,并经历了struts2的类型转换阶段后。接着进入struts2的输入校验阶段。
struts2的输入校验可自己编码进行校验,也可通过有规则命名的配置文件进行校验。

1.1)编码校验:

在Action类里重写父类的validate()方法即可。

public void validate(){

if(null == username || "".equals(username)){

this.addFieldError("username","username should not be empty !");

}else if(username.length() < 6 || username.length() > 12){

this.addFieldError("username","username should be between 6 and 12 !");

}



if(null == password || "".equals(password )){

this.addFieldError("password ","password should not be empty !");

}else if(password .length() < 6 || password .length() > 12){

this.addFieldError("password ","password should be between 6 and 12 !");

}

}

在上面的validate方法中,一旦发现校验失败,就把失败提示通过addFieldError方法添加到系统的fieldError中。校验完毕后,若系统的fieldError不为空,则自动转到input视图对应的JSP页面中输出错误提示,这与类型转换失败后的处理是完全一样的。

为了在input视图中对应的JSP页面输出错误提示,应该在该页面中增加如下代码:

<!-- 输入类型转换失败提示和校验失败提示 -->

<s:fielderror/>


这里不能忽略另外种情况:

Struts2的Action类里可以包含多个处理逻辑,不同的处理逻辑对应不同的方法。即Struts2的Action类里定义了几个类似于execute的方法,只是方法名不同。而重写validate方法无法知道需要校验的是哪个处理逻辑。实际上重写validate方法会校验所有的处理逻辑。

为了校验指定处理逻辑,需提供一个validateXxx()方法,其中xxx为Action对应的处理逻辑方法。


例如Action类里有个login()逻辑方法,那么对应的校验方法validateLogin()方法。

但之后还是会调用validate()进行校验,因此此时validate()没必要写了,或者让validate()进行公共字段的校验。


1.2)配置文件校验

只需为Action指定一个校验文件即可。

在Action类所在的com.test.action包下建立LoginAction-validation.xml校验文件(格式:Action类名-validation.xml).

LoginAction-validation.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "
http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd ">

<validators>

<field name="username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>username should not be empty !</message>
</field-validator>

<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">12</param>
<message>username should be between ${minLength} and ${maxLength}!</message>
</field-validator>
</field>

<field name="password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>password should not be empty !</message>
</field-validator>

<field-validator type="stringlength">
<param name="minLength">6</param>
<param name="maxLength">12</param>
<message>password should be between ${minLength} and ${maxLength}!</message>
</field-validator>
</field>

</validators>


每个元素指定一个Action属性必须遵守的规则,该元素name属性指定了被校验的字段;如果该属性满足多个规则,则在该下增多个。
每个指定一个校验规则,该元素的type属性指定校验器名称该元素可以包含多个子元素,用户指定该校验器的参数;除外,每个元素都有一个必须的元素,用户确定校验失败后的提示信息。

例子中只采用了"必填字符串校验器"和"字符串长度校验器"2个校验规则。

struts2貌似共提供了13个校验器:
required:必填校验器
requiredstring:必填字符串校验器
int:整数校验器
double:双精度浮点数校验器
date:日期校验器
expression:表达式校验器
fieldexpression:字段表达式校验器
email:电子邮件校验器
url:网址校验器
visitor:Visitor校验器
conversion:转换校验器
stringlength:字符串长度校验器
regex:正则表达式校验器

用法大部分雷同,用到的时候可自己google搜索。


配置文件校验肯定不输给编码校验的,自然也提供了对应于具体业务逻辑的校验规则文件的格式:


<Action类名-Action所包含的处理方法在struts.xml对应的name属性-validation.xml>

例:

<!-- 配置一个名为user的Action,对应的逻辑方法为UserAction的login方法-->

<action name="login" class="com.test.action.UserAction" method="login">
<result name="input">/login.jsp</result>
<result name="success">/index.jsp</result>
</action>


则此逻辑方法对应的校验规则文件为:
UserAction-login-validation.xml

与编码校验一样,校验错误信息会添加到系统的fieldError中,校验完毕后若FieldError不为空。则进入到input视图对应的JSP。在处输出错误提示。

提醒:没记错的话。与编码校验不同的是校验顺序,配置文件校验方式下,

先UserAction-validation.xml,再UserAction-login-validation.xml,




因此若是只针login()逻辑进行输入校验的话,那UserAction-validation.xml没必要写了,或让其进行公共字段的校验

2)客户端校验

增加客户端校验非常简单,将输入页面的表单元素改为使用struts2标签来生成表单,并且为该表单增加validate="true"属性即可

 

上面有助有快速的掌握了解校验器

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

我是可爱的分割线

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

下面将用整体的代码来详细的讲解校验器

 

Struts2 和Struts1同样也提供了校验框架,但在Struts2 已经不再把校验框架做为一个插件,而是已经内置到了Struts2中,而且配置起来更为简单方便,功能也更强大。

下面以一个例子来说明Struts2校验框架的使用。

1在myeclipse 中创建一个web工程,在src目录下创建struts.xml 配置文件,添加好xml标头,配置web.xml文件。

1-1.了解一下我做的简单例子需求,实现一个用户注册的功能,用户信息包括用户名,密码,确认密码,年龄,出生日期,毕业日期等信息。在注册过程需要提供以下校验规则:

         [1] 用户必填,长度在6-10之间

         [2] 密码和确认密码必填,两次输入密码要一致长度,在6-10之间

         [3] 年龄必须是数字界于1-150之间

         [4] 出生日期和毕业日期必填,且出生日期必须早于毕业日期

要求:使用struts2 提供的xml配置方式进行校验。

1-2.首先创建一个register.jsp 页面,代码如下:

<%@ page language="java"  pageEncoding="UTF-8"%>

<%@ taglib uri="/struts-tags" prefix="s" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <title>register page</title>

    <meta http-equiv="pragma" content="no-cache">

    <meta http-equiv="cache-control" content="no-cache">

    <meta http-equiv="expires" content="0">   

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="This is my page">

    <SCRIPT type="text/javascript">

        function validate(){

            var usernameValue=document.getElementById("username").value;

            var passwordValue=document.getElementById("password").value;

            var repasswordValue=document.getElementById("repassword").value;

            if(usernameValue.length==0){

                alert("username should not be blank!");

                return false;

            }else if(usernameValue.length<6 || usernameValue.length>10){

                alert("username should be between 6 and 10 !");

                return false;

            }

            return true;

        }

    </SCRIPT>

  </head>

  <body>

    <s:fielderror cssStyle="color:red;"/>

    <s:form action="register2" theme="simple">

    <table border="1" cellpadding="0" cellspacing="0">

        <tr>

            <td>username</td>

            <td><s:textfield name="username"  label="usernmae" id="username"/></td>

        </tr>

        <tr>

            <td>password</td>

            <td><s:password name="password" label="password" id="password"/></td>

        </tr>

        <tr>

            <td>repassword</td>

            <td><s:password name="repassword" label="repassword" /></td>

        </tr>

        <tr>

            <td>age</td>

            <td><s:textfield  name="age" label="age"/></td>

        </tr>

        <tr>

            <td>birthday</td>

            <td><s:textfield name="birthday" label="birthday"/></td>

        </tr>

        <tr>

            <td>graduation</td>

            <td><s:textfield name="graduation" label="graduation"/></td>

        </tr>

        <tr>

            <td>&nbsp;</td>

            <td><s:submit /></td>

        </tr>

    </table>

    </s:form>

  </body>

</html>

显示如下:

1-3.创建RegisterAction 代码如下:

package com.snt.struts2.action;

import java.util.Calendar;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction extends ActionSupport {

    private String username;

    private String password;

    private String repassword;

    private int age;

    private Date birthday;

    private Date graduation;

    public int getAge() {

        return age;

    }

    public void setAge(int age) {

        this.age = age;

    }

    public Date getBirthday() {

        return birthday;

    }

    public void setBirthday(Date birthday) {

        this.birthday = birthday;

    }

   

    public Date getGraduation() {

        return graduation;

    }

    public void setGraduation(Date graduation) {

        this.graduation = graduation;

    }

    public String getPassword() {

        return password;

    }

    public void setPassword(String password) {

        this.password = password;

    }

    public String getRepassword() {

        return repassword;

    }

    public void setRepassword(String repassword) {

        this.repassword = repassword;

    }

    public String getUsername() {

        return username;

    }

    public void setUsername(String username) {

        this.username = username;

    }

   

    public String execute() throws Exception {

        return SUCCESS;

    }

   

    /**

     * 注册1方法

     * @return

     * @throws Exception

     */

    public String register1() throws Exception {

        return SUCCESS;

    }

    public String abc()throws Exception{

        System.out.println("abc method invoke!");

        return SUCCESS;

    }

    public String xyz()throws Exception{

        System.out.println("abc method invoke!");

        return SUCCESS;

    }

    public void validateAbc(){

        System.out.println("valide abc()");

    }

    public void validateXyz(){

        System.out.println("valide xyz()");

    }

    /***

     * 当遇到类型转化时,struts2自动生成一条错误信息,放到

     * fielderrors 中

     */

    public void validateExecute() {

        //当用户直接访问action时,action的属性都是null

        //防止NullPointException

        System.out.println("validate()...........");

       

        if(null==username || username.length()<6 || username.length()>10){

            this.addActionError("username invalid!");

        }

        if(null==password ||  password.length()<6 || password.length()>10){

            this.addActionError("password is invalid!");

        }else if(null==repassword ||  repassword.length()<6 || repassword.length()>10){

            this.addActionError("password is invalid!");

        }else if(!password.equals(repassword)){

            this.addActionError( "tow password is not be same!");

        }

       

        if(age<=0 || age>150){

            System.out.println("ERROR");

            this.addActionError( "age is invalid!");

        }

        if(null!=birthday && null!=graduation){

            Calendar c1=Calendar.getInstance();

            c1.setTime(birthday);

            Calendar c2=Calendar.getInstance();

            c2.setTime(graduation);

            if(!c1.before(c2)){

                this.addActionError("birthday shoud before graduation!");

            }

        }

    }

   

    public void validateRegister1() {

        //当用户直接访问action时,action的属性都是null

        //防止NullPointException

        System.out.println("validate()...........");       

        System.out.println("validate()...........");

        if(null==username || username.length()<6 || username.length()>10){

            this.addFieldError("username", "username is invalid");

        }

        if(null==password ||  password.length()<6 || password.length()>10){

            this.addFieldError("password", "password is invalid!");

        }else if(null==repassword ||  repassword.length()<6 || repassword.length()>10){

            this.addFieldError("password", "password is invalid!");

        }else if(!password.equals(repassword)){

            this.addFieldError("password", "tow password is not be same!");

        }

       

        if(age<0 || age>150){

            this.addFieldError("age", "age is invalid!");

        }

       

       

        if(null==birthday){

            this.addFieldError("birthday", "birthday invalid!");

        }

        if(null==graduation){

            this.addFieldError("graduation", "graduation  invalid!");

        }

        if(null!=birthday && null!=graduation){

            Calendar c1=Calendar.getInstance();

            c1.setTime(birthday);

            Calendar c2=Calendar.getInstance();

            c2.setTime(graduation);

            if(!c1.before(c2)){

                this.addFieldError("birthday","birthday shoud before graduation!");

            }

        }

    }

}

1-4.采用Struts2的检验框架需要创建一个配置文件,规则如下,我们需要在与所有要进行校验的Action同级别目录下创建一个xml文件,命名必须遵守规则:Action名-validation.xml 文件,对于这个例子就是:RegisterAction-validation.xml 做为校验的配置文件,下面我创建这个文件:代码如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC

        "-//OpenSymphony Group//XWork Validator 1.0.2//EN"

        "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

<validators>

    <field name="username">

        <field-validator type="requiredstring" short-circuit="false">

            <param name="trim">true</param>

            <message>username shoudld not be blank!</message>

        </field-validator>

        <field-validator type="stringlength">

            <param name="minLength">6</param>

            <param name="maxLength">10</param>

            <message>username should be between ${minLength} and ${maxLength}</message>

        </field-validator>

    </field>

   

    <field name="password">

        <field-validator type="requiredstring">

            <message>password should not be balank!</message>

        </field-validator>

        <field-validator type="stringlength">

            <param name="minLength">6</param>

            <param name="maxLength">10</param>

            <message>password should be between ${minLength} and ${maxLength}</message>

        </field-validator>

    </field>

   

    <field name="repassword">

        <field-validator type="requiredstring">

            <message>repassword should not be balank!</message>

        </field-validator>

        <field-validator type="stringlength">

            <param name="minLength">6</param>

            <param name="maxLength">10</param>

            <message>repassword should be between ${minLength} and ${maxLength}</message>

        </field-validator>

    </field>

   

    <field name="repassword">

        <field-validator type="fieldexpression">

            <param name="expression"><![CDATA[(password==repassword)]]>

            </param>

            <message>two password should be the same! </message>

        </field-validator>

    </field>

       

    <field name="age">

        <field-validator type="int">

            <param name="min">1</param>

            <param name="max">150</param>

            <message>age should be between ${min} and ${max}</message>

        </field-validator>

    </field>

   

    <field name="birthday">

        <field-validator type="required">

            <message>birthday should not be blank!</message>

        </field-validator>

        <field-validator type="date">

            <param name="min">2001-01-01</param>

            <param name="max">2004-01-01</param>

            <message>birthday should be between ${min} and ${max}</message>

        </field-validator>

    </field>

   

    <field name="graduation">

        <field-validator type="required">

            <message>graduation should not be blank!</message>

        </field-validator>

        <field-validator type="date">

            <param name="min">2005-01-01</param>

            <param name="max">2008-01-01</param>

            <message>birthday should be between ${min} and ${max}</message>

        </field-validator>

       

    </field>

</validators>

对于Struts2提供的校验方式有两种:1 字段校验   2 非字段校验

针对字段校验就如上面xml文件所写,是针对字段,字段中再配置各种校验规则。而对于非字段指的是:先定义好校验器,校验器中再配置针对那个字段进行校验。其实两种校验方式底层使用机制都是一样。

比如上面针对用户的校验,如下定义:

<field name="username">

        <field-validator type="requiredstring" short-circuit="false">

            <param name="trim">true</param>

            <message>username shoudld not be blank!</message>

        </field-validator>

        <field-validator type="stringlength">

            <param name="minLength">6</param>

            <param name="maxLength">10</param>

            <message>username should be between ${minLength} and ${maxLength}</message>

        </field-validator>

    </field>

 

先用<field>标签描述要校验的字段,里面定义校验器,使用<field-vaidator>标签,这个标签中有个type 属性,这个属性指是就是校验规则,比如:requiredstring  就代表必填表的字符串,表明这个信息是用户必须输入的。需要注意的是type属性不是随便写的,这个名字会对应struts2 提供的各样校验器类。我们查找strust2 原代码会在xwork jar包中的 com.opensymphony.xwork2.validator.validators包下面找到一个default.xml 配置文件,里面代码如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE validators PUBLIC

        "-//OpenSymphony Group//XWork Validator Config 1.0//EN"

        "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">

<!-- START SNIPPET: validators-default -->

<validators>

    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>

    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>

    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>

    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>

    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>

    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>

    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>

    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>

    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>

    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>

    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>

    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>

    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>

</validators>

<!--  END SNIPPET: validators-default -->

 

这里面大家可以很清楚的看到,配置是每个校验器对应的名称和校验需要的类,每个校验都有一个name属性,这个属性就是我们在ActionName-validation.xml 配置文件中<field-validator> 标签type属性要可以使用的值,同样我们也可心在com.opensymphony.validator.validators包中找到对应的校验器类,比如:我们可以打开

com.opensymphony.validator.validators.RequiredStringValidator 类源代码如下:

/*

 * Copyright (c) 2002-2006 by OpenSymphony

 * All rights reserved.

 */

package com.opensymphony.xwork2.validator.validators;

 

import com.opensymphony.xwork2.validator.ValidationException;

 

public class RequiredStringValidator extends FieldValidatorSupport {

 

    private boolean doTrim = true;

    public void setTrim(boolean trim) {

        doTrim = trim;

    }

    public boolean getTrim() {

        return doTrim;

    }

    public void validate(Object object) throws ValidationException {

        String fieldName = getFieldName();

        Object value = this.getFieldValue(fieldName, object);

        if (!(value instanceof String)) {

            addFieldError(fieldName, object);

        } else {

            String s = (String) value;

            if (doTrim) {

                s = s.trim();

            }

            if (s.length() == 0) {

                addFieldError(fieldName, object);

            }

        }

    }

}

在usrename 的必须字段校验串中有这样一段配置

<param name="trim">true</param>

大家再年,上面红色背景显示的一段代码,就可以明白,这个参数就是赋值为这个属性的。表明校验时要去掉字符串两边的空格。当然如果有其它方法,也可以这样使用<param>标签传参数。<message>标签中信息是校验失败后要显示的信息。

上面为username 定义了一个必填字段校验器外,还添加了一个长度限制的校验器stringlength 校验器。其它配置都是一样的!

 

上面说过了,字段校验有两种,一种是上面所说的字段校验,另一种是非字段校验,下面我们看一下:

针对username 的非字段校验配置如下:

         <validator type="requiredstring">

        <param name="fieldName">username</param>

        <message>username should not be blank</message>

    </validator>

   

    <validator type="stringlength">

        <param name="fieldName">username</param>

        <param name="minLength">6</param>

        <param name="maxLength">10</param>

        <message>username should  be between ${minLength} and

${maxLength}</message>

    </validator>

看上面的配置,先定义一个校验器,使用<validator>标签,然后在标签里配置的参数

<param name="fieldName">username</param>

name 属性是不变的,使用fieldName 代表字段名,标签中间的值代表要校验的字段,下面的<message>标签中信息是校验失败后要显示的信息。其实非字段校验和这字段校验没什么区别,只是配置文件不一样而已,在开发中建议使用字段校验,会更清晰一点!

 

1-5.OK这样配置,整个配置文件都可以生产了,运行测试应用,显示如下:

OK,校验测试成功。

 

另外在校验过程中还要注意一些问题:

多方法Action情况如何使用配置文件进行校验?

我们知道大多数据情况下,Action可能会有多个方法,面我们上面所说的都是针对execute()方法进行的校验,如果存在多方法的情况下,需要进行校验的信息肯定是不样的,一个配置文件肯定解决不了问题,所有在多方式需要校验的情况下,我们需要在Action同级别的目录下,创建命名规则如下的配置文件:ActionName-method-validation.xml 配置文件,比如:RegisterAction中有个test()方法需要校验,可以创建

RegisterAction-test-validation.xml 配置文件进行配置,这个文件就会针对tets()方法进行校验,但是需要注意的是:在调用test()方法时,使用RegisterAction-test-vaidation.xml  文件进行校验后,还会调用RegisterAction-vaidation.xml 文件进行校验,这样的话,肯定会产生干扰,为了解决这样问题,可以在开发过程中,不提供RegisterAction-validtion.xml 这样的文件,对于execute()方法,可以提供一个RegisterAction-execute-validation.xml 文件进行配置校验。

 XML方式校验与硬编码方式校验的选择|

我们采用了XML 配置文件的方式进行校验,介是Action中的validate()方法同时也会被执行的,这时一些校验就可能会重复!所以在开发过程中,我们只采用一种方式,要么使用XML方式进行校验,要么采用硬编码的方式进行校验,而不建议混合使用的方式;一般情况下,我们采用XML方式进行校验,而且XML方式可以满足我们的需求,在业务特别复杂或校验粒度比较细的情况下我们可以采用硬编码的方式校验。

 

1.6.Struts2 XML配置方式进行是服务器端校验,当然在开发过程中我们经常会需要客户端校验,Struts2也提供了客户端校验功能,使用客户端校验,首先页面中Struts2 标签的主题不能设为simple主题,另外form标签的validate 属性要改为true。但是Struts2提供的这种客户端校验功能是非常有限的,所有在需要使用客户端校验的情况,可以采用javascript 或Ajax的方式进行校验,会更灵活一点。

 

0 0
原创粉丝点击