`
bj_liuhuibin
  • 浏览: 21380 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

struts2 验证框架以及扩展

 
阅读更多
struts2能够对前台提交的表单数据进行输入有效性校验,通常有两种方式:

1、在Action类中通过validatexx方法验证,这种方式很简单,在此不再赘述;

2、通过编写xx-validation.xml文件执行表单验证,当用户提交表单请求后,struts会优先执行xml文件,如果校验不通过是不会让请求访问指定action的。

本文介绍一下struts2通过xml文件进行校验的方法并说明怎么样扩展自定义的验证。



一、struts2验证框架的包位置

部署struts2项目有一个必备jar包:xwork-core-*.jar,在这个包中有这样一个package"com.opensymphony.xwork2.validator.validators",所有官方验证类就放在这下面的,在这个包下面有一个"default.xml"文件,这就是验证框架的核心文件,里面配置了所有的验证类数据。

验证类的格式为:<validator name="别名" class="验证类"/>,在配置的时候只需要使用别名就能执行指定验证了。

在这介绍struts2的几个常用的验证类:

required:字段不能为空

requiredstring:字符串不能为空

int:int类型(可指定范围)

long:long类型(可指定范围)

short:short类型(可指定范围)

double:double类型(可指定范围)

date:时间格式(可指定范围)

expression:ognl表达式判断

fieldexpression:ognl表达式判断

email:邮箱判断

url:url路径判断

visitor:把同一个验证程序配置文件用于多个动作(对一个Bean写验证文件,每个使用的Action只要引用)

conversion:格式转换

stringlength:字符串长度

regex:正则表达式判断

这里有个地址详细介绍了这几种验证的使用方法,大家可以参考下:http://code.google.com/p/j2eewiki/wiki/Struts2Validator

以上验证乍看还是非常全面的,但是很多验证功能还不够强大(比如stringlength是把任何文字都当做1的长度,而中文像UTF-8是3个字节的长度,这样验证效果就不准确了),所以很多时候是需要进行自定义验证的,这个随后再说。



二、使用xml配置验证

①copy上面提到的"default.xml"文件到Action同级目录下,修改文件名为"action名-validation.xml"。假设有这样一个Action:com.struts.action.UserAction.java,那么你需要将xml文件放到com.struts.action包下面,并且改名为"UserAction-validation.xml"。

②删除标签<validators>里所有的内容,并且更改xml上面的dtd版本为1.0.2.dtd,这里我也不知道为什么1.0.0跑不起,反正改了就能执行了。

Xml代码 
<!DOCTYPE validators PUBLIC   
        "-//OpenSymphony Group//XWork Validator 1.0.2//EN"   
        "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> 

<!DOCTYPE validators PUBLIC
  "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
  "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd"> ③编写验证文件,field标签表示被验证的字段项,field-validator标签表示使用什么验证约束,short-circuit表示如果有多个验证约束时只要有一个不通过则后面就不执行验证了,message表示验证不通过时返回的错误消息。

Xml代码 
<field name="user.name"> 
    <field-validator type="requiredstring" short-circuit="true"> 
        <message>用户名不能为空</message> 
    </field-validator> 
</field> 

<field name="user.name">
<field-validator type="requiredstring" short-circuit="true">
<message>用户名不能为空</message>
</field-validator>
</field> 按照上面三步,一个基本的验证就出来了,大家可以去试试,只要提交的表单访问UserAction都会先通过xml的验证。假如你只想验证UserAction中的userAdd方法,则只需要将xml文件改名为"UserAction-userAdd-validattion.xml"即可。



三、扩展struts2验证类

其实自定义验证类很简单,你只需要仿照struts2的任何一个验证类就能做出来,前面提到不能验证utf-8格式的字符长度,我们在这就做一个获取utf-8长度的自定义框架。

①创建验证框架扩展类,这里必须继承 FieldValidatorSupport 类,重写validate方法,具体验证代码就在validate方法中写,这里的get、set就是在xml中出现的属性参数。这段代码还不够好,其实可以把encoding也作为属性的,这样传入任何编码格式都能获取该编码对应的字符长度。

Java代码 
public class CheckStringLength extends FieldValidatorSupport {  
      
    private boolean trim;  // 是否去首位空格  
    private int minLength; //最大长度  
    private int maxLength; //最小长度  
    private static final String ENCODING = "UTF-8"; //编码格式(默认utf-8)  
      
    /* 
     * 构造方法初始化默认数据 
     */ 
    public CheckStringLength() {  
        this.trim = true;  
        this.minLength = -1;  
        this.maxLength = -1;  
    }  
      
    public boolean isTrim() {  
        return trim;  
    }  
    public void setTrim(boolean trim) {  
        this.trim = trim;  
    }  
    public int getMinLength() {  
        return minLength;  
    }  
    public void setMinLength(int minLength) {  
        this.minLength = minLength;  
    }  
    public int getMaxLength() {  
        return maxLength;  
    }  
    public void setMaxLength(int maxLength) {  
        this.maxLength = maxLength;  
    }  
 
    @Override 
    public void validate(Object arg0) throws ValidationException {  
        String fieldName = this.getFieldName();  
          
        String val = (String) this.getFieldValue(fieldName, arg0);  
          
        //如果值为空则直接不通过  
        if (val == null || val.length() <= 0) {  
            return;  
        }  
          
        if (trim) {  
            val = val.trim();  
            ////如果值为空则直接不通过  
            if (val == null || val.length() <= 0) {  
                return;  
            }  
        }  
          
        int length = 0;  
        try {  
            //根据编码格式获得字符长度  
            length = val.getBytes(ENCODING).length;  
        } catch (UnsupportedEncodingException e) {  
            length = val.getBytes().length;  
        }  
          
        /* 
         *判断字符长度范围  
         */ 
        if (minLength > -1 && length < minLength) {  
            this.addFieldError(fieldName, arg0);  
        }  
        if (maxLength > -1 && maxLength > maxLength) {  
            this.addFieldError(fieldName, arg0);  
        }  
    }  
      


public class CheckStringLength extends FieldValidatorSupport {

private boolean trim;  // 是否去首位空格
private int minLength; //最大长度
private int maxLength; //最小长度
private static final String ENCODING = "UTF-8"; //编码格式(默认utf-8)

/*
* 构造方法初始化默认数据
*/
public CheckStringLength() {
this.trim = true;
this.minLength = -1;
this.maxLength = -1;
}

public boolean isTrim() {
return trim;
}
public void setTrim(boolean trim) {
this.trim = trim;
}
public int getMinLength() {
return minLength;
}
public void setMinLength(int minLength) {
this.minLength = minLength;
}
public int getMaxLength() {
return maxLength;
}
public void setMaxLength(int maxLength) {
this.maxLength = maxLength;
}

@Override
public void validate(Object arg0) throws ValidationException {
String fieldName = this.getFieldName();

String val = (String) this.getFieldValue(fieldName, arg0);

//如果值为空则直接不通过
if (val == null || val.length() <= 0) {
return;
}

if (trim) {
val = val.trim();
////如果值为空则直接不通过
if (val == null || val.length() <= 0) {
return;
}
}

int length = 0;
try {
//根据编码格式获得字符长度
length = val.getBytes(ENCODING).length;
} catch (UnsupportedEncodingException e) {
length = val.getBytes().length;
}

/*
*判断字符长度范围
*/
if (minLength > -1 && length < minLength) {
this.addFieldError(fieldName, arg0);
}
if (maxLength > -1 && maxLength > maxLength) {
this.addFieldError(fieldName, arg0);
}
}

}


②新建validators.xml文件,将"default.xml"的配置信息和自定义验证类的配置信息放到文件中,最后把validators.xml文件放到源码根目录下:

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">    
 
<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"/> 
      
    <!-- 自定义验证规则 --> 
    <validator name="stringlengthencoding" class="com.bless.struts2.validate.CheckStringLength"/> 
   </validators> 

<?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"> 

<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"/>
   
    <!-- 自定义验证规则 -->
    <validator name="stringlengthencoding" class="com.bless.struts2.validate.CheckStringLength"/>
   </validators> ③按照前面所说的编写表单验证规则,注意这里的param就是上面CheckStringLength类中的属性,但是属性是根据get、set方法来的 (因为struts2做了一个很蛋痛的事:他的验证类中有这样一个属性"doTrim",但是该属性对应的get、set方法是getTrim、setTrim,配置文件里必须这样写<param name="trim">false</param>,记住是根据set方法配置param)。

Xml代码 
<!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="user.name"> 
        <field-validator type="requiredstring" short-circuit="true"> 
            <message>用户名不能为空</message> 
        </field-validator> 
        <field-validator type="stringlengthencoding" short-circuit="true"> 
            <param name="maxLength">10</param> 
            <param name="minLength">6</param> 
            <message>用户名必须是6到10位字符!</message> 
        </field-validator> 
    </field> 
</validators> 

<!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="user.name">
<field-validator type="requiredstring" short-circuit="true">
<message>用户名不能为空</message>
</field-validator>
<field-validator type="stringlengthencoding" short-circuit="true">
<param name="maxLength">10</param>
<param name="minLength">6</param>
<message>用户名必须是6到10位字符!</message>
</field-validator>
</field>
</validators>基本上一个简单的自定义验证就完成了,大家可以手动试试,这个东西确实很简单。



最后附上扩展的几个验证类,希望对大家有所帮助 :

Xml代码 
<!-- 根据编码格式获取字符串长度,并且可以校验长度范围 --> 
    <validator name="stringlengthencoding" class="com.bless.struts2.validate.CheckStringLength"/> 
    <!-- 检查常用的格式,目前能验证:邮箱、手机、固定电话和身份证号 --> 
    <validator name="checkformat" class="com.bless.struts2.validate.CheckFormat"/> 
    <!-- 检查是否是半角字符 --> 
    <validator name="checkhalfwidthdigit" class="com.bless.struts2.validate.CheckHalfWidthDigit"></validator> 
    <!--  检查字符串格式,这里可以中文、字母、数字和符号任何组合配置 --> 
    <validator name="checkspecialchar" class="com.bless.struts2.validate.CheckSpecialChar"></validator> 
    <!-- 检查时间 --> 
    <validator name="checkdate" class="com.bless.struts2.validate.CheckDate"/> 
    <!-- 检查小数值,可以验证小数点精确范围 --> 
    <validator name="checkdoublerange" class="com.bless.struts2.validate.CheckDoubleAccuracy"/> 
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    struts2验证框架

    2. 可扩展性:Struts2 验证框架提供了高度的可扩展性,可以根据不同的业务逻辑添加新的Validators和Validation Rules,以满足新的验证需求。 3. 高效性:Struts2 验证框架提供了高效的验证机制,可以快速地对用户...

    struts2验证框架简单示例

    在Struts2中,验证框架是处理用户输入验证的关键部分,它确保了从客户端接收到的数据的质量和准确性。本示例将深入探讨Struts2验证框架的基本用法,特别适合初学者理解和掌握。 ### 一、Struts2验证框架概述 ...

    Struts2 校验器

    Struts2的校验框架是基于Apache Commons Validator库的,它允许开发者定义一系列的验证规则来检查用户的输入。这些规则可以是简单的数据类型检查,如非空、长度限制,也可以是复杂的业务逻辑校验。校验过程通常分为...

    struts2 校验框架

    在Struts2中,校验框架是用于确保用户输入数据有效性和完整性的关键部分。这篇博文主要讨论了Struts2的验证框架及其工作原理。 Struts2的验证框架允许开发者定义一套规则来验证用户提交的数据,这些规则通常存储在...

    Struts2自定义校验框架

    Struts2的自定义校验框架允许开发者根据具体需求创建和配置校验器,提高了代码的灵活性和可扩展性。通过理解和实践自定义校验,开发者可以更好地掌控数据校验的过程,确保应用程序的数据安全性。在`validationdemo2...

    struts2验证框架的使用和扩展

    本文将深入探讨Struts2验证框架的使用和扩展。 1. **Struts2验证框架基础** - **Action与Validator**: 在Struts2中,Action类是业务逻辑的载体,Validator则用于验证Action中的字段。通过在Action类中定义需要验证...

    struts2框架2016版资料day01

    5. **拦截器**:拦截器是Struts2的一大特色,它允许开发者在Action调用前后插入自定义逻辑,比如日志记录、权限验证、数据校验等。在day01的课程中,你可能会学习如何定义和使用拦截器,以及如何在配置文件中配置...

    Struts2的校验框架

    总的来说,Struts2的校验框架通过提供灵活的配置和易于扩展的机制,使得Web应用的输入验证变得简单而有效。它可以帮助开发者避免因用户输入不合法而导致的程序错误,提升应用的用户体验,同时增强系统的稳定性和安全...

    Struts 2 自定义MVC 框架

    - 如何利用Struts 2的插件系统扩展功能,如国际化、验证等。 理解Struts 2的架构和工作流程,对于任何Java Web开发者来说都至关重要,无论是为了优化现有项目,还是开发新的应用。而通过实践自定义框架,我们可以更...

    Struts2框架源码

    Struts2框架是Java Web开发中的一个流行框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了一种结构化和可扩展的方式来构建应用程序。此压缩包文件包含的是Struts2的源码,特别适合初学者研究和学习...

    [原]Struts2校验框架

    在Struts2中,校验框架是一个核心组件,它负责处理用户输入的数据验证,确保数据的正确性和完整性。以下是对Struts2校验框架的详细讲解。 1. **Struts2验证框架的基本概念** Struts2的验证框架主要负责在用户提交...

    Struts2 验证框架

    验证框架是Struts2中的一个重要组成部分,用于处理用户输入的数据验证。在这个框架中,验证逻辑与业务逻辑分离,使得代码更易于管理和扩展。 在Struts2验证框架中,主要有两种验证方式:客户端验证和服务器端验证。...

    Struts2输入校验总结

    综上所述,Struts2的输入校验机制不仅支持基本的手动校验,还提供了高度可配置和扩展的验证框架,使得开发者能够根据应用的具体需求,灵活地实现各种校验逻辑,从而提升应用程序的质量和用户体验。

    struts2框架源码

    6. **Plug-in机制**:Struts2支持插件化开发,可以通过添加插件来扩展框架功能,如报表、图表、富文本编辑器等。 7. **Freemarker / JSP 视图技术**:Struts2支持多种视图技术,如Freemarker模板语言和JSP,允许...

    Struts2 框架概述

    Struts2采用了一种基于拦截器(Interceptor)的设计模式,这一设计大大增强了框架的灵活性和扩展性。通过定义不同的拦截器,可以方便地控制Action的执行流程,实现诸如权限验证、数据校验等功能。 - **核心组件**:...

    Struts2框架搭建

    Struts2还有许多高级特性,如插件系统、国际化、数据验证、拦截器的自定义、以及与其他框架如Spring、Hibernate的集成。深入学习Struts2将有助于提升开发Web应用的效率和质量。对于初学者来说,了解和实践上述步骤是...

    java自制struts2小框架

    3. **Interceptor拦截器**:Struts2的拦截器是其核心特性之一,它允许在Action执行前后插入自定义逻辑,如日志、权限验证、数据校验等。通过组合多个拦截器,可以实现灵活的业务流程控制。 4. **Result类型与视图...

    struts2框架的使用

    Struts2是一个强大的Java web开发框架,它基于MVC(Model-View-Controller)设计模式,为构建可维护、可扩展且易于管理的企业级应用程序提供了坚实的基础。在本压缩包中,你可能会找到关于Struts2框架配置和使用的...

    struts2框架详解

    - Struts2拥有丰富的插件生态系统,如REST插件、Ajax插件、Freemarker和Velocity模板插件等,可以扩展框架的功能。 9. **与Spring的整合** - 使用`struts2-spring-plugin`,可以直接在Spring容器中管理Action实例...

    struts2框架jar包

    10. **数据校验**:Struts2的Validator框架允许开发者定义数据校验规则,自动对用户输入进行验证,提高应用的安全性。 综上所述,Struts2框架的jar包包含了运行和开发基于Struts2的应用所需的所有组件和库,如核心...

Global site tag (gtag.js) - Google Analytics