`
啸笑天
  • 浏览: 3460971 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

Struts2的数据验证框架validation framework

阅读更多

struts2的核心是从webwork演变来的,其数据验证框架其实就是原webwork的那一套东西。

  一,Struts2数据验证的整体框架介绍

  struts2的action都要继承ActionSupprot类,这个类实现了ValidateableValidationAware这两个跟数据验证有关的接口。其中Validateable只有一个方法validate()用于数据验证;ValidationAware 则用于记录验证出错时的相关信息。

  而数据验证在什么时候被调用呢?数据验证的调用是包装在workflow拦截器里,

  我们看看workflow拦截器在struts_default.xml中的定义,它是放在默认的defaultStack拦截器组里,相关顺序如下:

 

  <interceptor-ref name="params"/>
  <interceptor-ref name="conversionError"/>
  <interceptor-ref name="validation"/>
  <interceptor-ref name="workflow"/>

  params与conversionError这两个拦截器在workflow的前面,它们的工作是从request中把数据转成正确的Java类型数据,以供后面处理。validation拦截器实质是AnnotationValidationInterceptor与我们这里谈的数据验证不是一回事,它只判断有没有@SkipValidation注解,如果有就不会路过数据验证,只是起一个开关作用。

  当workflow拦截器触发时,它先检查当前请求的action是否实现了Validateable接口,如果实现了该接口,则调用 validate()方法:如果这个方法处理时发现有数据验证不通过,则会生成一个错误信息并交给ValidationAware的方法去存储这些出错信息。当validate()方法执行完毕,workflow拦截器还要调用ValidationAware的hasErrors()方法,看看是否有出错信息生成,如果有出错信息,就中断当前action的执行流程,返回"input"字符串,一般我们是在配置文件struts.xml里配置"input"返回结果的跳转页面。

  二,数据验证的方式
 
  1,在action类里实现validate()方法
  这是最简单的方法了,直接在actionClass中实现Validateable接口的方法,如:

  public class RegUser  extends ActionSupport  {
     public String execute(){       

         return SUCCESS;               
     }
     private String username;           
     private String password;            
     
  // Getters and setters omitted
  public void validate(){                                                                  
        if ( getPassword().length() == 0 ){                                     
            addFieldError( "password", getText("密码不能为空") );
        }
        if ( getUsername().length() == 0 ){                                    
            addFieldError( "username", getText("用户名不能为空") );
       }
      .  .  . 
    }
 }

   配置文件:
<action name="regUser">
   <result name="success">
      /WEB-INF/pages/regsucc.jsp
   </result>
   <result name="input">
      /WEB-INF/pages/regerror.jsp
   </result>
  </action>  

   把所有的判断逻辑直接写到action类里,如果有验证错误,直接返回"input"。

  2,使用xml配置文件:ActionClass-validations.xml

   其实struts2已经内置了一些基本的数据验证,完全可以省去我们日常的一些数据验证需求,通过配置文件的方式。
   在ActionClass所在的目录下,新建一个以ActionClass名字组合成的特定xml:ActionClass-validations.xml(例,我的ActionClass名为RegUser,则我应该在同目录下建一名为RegUser-validations.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">  <!-  声明该字段验证器的类型为"必填的字符串" ->
            <message>用户名不能为空</message>      <!- 如果验证不通过时的出错信息 ->
        </field-validator>
    </field>
   
    <field name="password">
        <field-validator type="requiredstring">
            <message>密码不能为空</message>
        </field-validator>
    </field>
   
   <!-
    <field name="age">
        <field-validator type="int">  <!-  声明该字段验证器的类型为"必须是整数" ->
            <param name="min">13</param>  <!-  声明该字段最小值是13 ->
            <param name="max">20</param>      <!-  声明该字段最大值是20 ->
            <message>
                必须在 13至20之间
            </message>
        </field-validator>
    </field>
    ->
</validators>

    以下是目前struts2所支持的内置的验证器说明,我们可以直接在xml文件里声明拿来使用:


 

3,使用自己定义的验证器做数据验证


   前面介绍过的第2种方式,是利用struts自带的验证器,通过xml配置文件来进行数据验证的,但如果我们的验证要求比较特殊,比如对一个参数的复杂数据、字符组合要求,则可能会考虑自己写一个验证器,如果是这样,那为什么不彩第1种方式,直接在action里实现validate方法呢?是的,当然这样也可以,但我们的目标是尽可能重用代码,或许这个类型的数据验证会用在多个action,甚至于提供给后来的同学们使用,抽象成一个独立的验证器,通过配置文件来声明,以达到复用。

  下面就介绍如果新建一个可复用的自定义验证器。

  一般新建自定义的验证器,我们要继承ValidatorSupportFieldValidatorSupport类。下面以一个密码验证的代码例子为说明:
   所需验证的密码数据要满足下面条件:
   1,密码中要包含字母,大小写均可
   2,密码中要包含数字,0-9
       3,密码中要包含至少一个特殊字符

   参见以下代码:
   1,我们要先继承FieldValidatorSupport(该类已经继承ValidatorSupport)类
       2,为我们的验证声明几个正则表达式的pattern:对数字的,普通字符,以及特殊字符
   3,实现validate()方法,在这里实现验证的逻辑代码
   4,利用继承自FieldValidatorSupport中的getFileName()和getFileValue()方法获取要进行验证的数据
   5,如果验证不通过,要调用addFieldError()方法,继承自ValidatorSupport类,以声明错误


public class PasswordIntegrityValidator  extends FieldValidatorSupport { 
   static Pattern digitPattern = Pattern.compile( "[0-9]");                   
   static Pattern letterPattern = Pattern.compile( "[a-zA-Z]");             
   static Pattern specialCharsDefaultPattern = Pattern.compile( "!@#$");

   public void validate(Object object) throws ValidationException {
      String fieldName = getFieldName();                                        
      String fieldValue = (String) getFieldValue(fieldName, object );
      fieldValue = fieldValue.trim();                              
      Matcher digitMatcher = digitPattern.matcher(fieldValue);       
      Matcher letterMatcher = letterPattern.matcher(fieldValue);       
      Matcher specialCharacterMatcher;                                
      if ( getSpecialCharacters() != null ){                                       
         Pattern specialPattern = 
                     Pattern.compile("[" + getSpecialCharacters() + "]" );    
         specialCharacterMatcher = specialPattern.matcher( fieldValue );
      } else{
         specialCharacterMatcher = 
                     specialCharsDefaultPattern.matcher( fieldValue );        
      }
      if ( !digitMatcher.find() ) {                         
         addFieldError( fieldName, object );             
      }else if ( !letterMatcher.find() ) {               
         addFieldError( fieldName, object );            
      }else if ( !specialCharacterMatcher.find() ) {
         addFieldError( fieldName, object );            
 }
   }
   private String specialCharacters;
   public String getSpecialCharacters() {
return specialCharacters;
}
    public void setSpecialCharacters(String specialCharacters) {
this.specialCharacters = specialCharacters;
}
}

 

  在建完主体的验证器代码,就要在配置文件中声明它,以便我们使用:
  在WEB-INF/classes/下新建或编辑validators.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="passwordintegrity"  
              class="manning.utils.PasswordIntegrityValidator"/> 
</validators> 

  完成了声明,我们就可以使用前面介绍过的使用xml配置文件:ActionClass-validations.xml的方式来使用这个验证器了:

  在为要使用的类的目录下建立ActionClass-validations.xml的文件,增加如下内容:
  
   <field-validator type="passwordintegrity">
        <param name="specialCharacters">$!@#?</param>
        <message>您的密码必须包括至少一个数字,字符,并包括如下的特殊的字符: "${specialCharacters}".
        </message>
   </field-validator>

 


 

  • 大小: 31.2 KB
分享到:
评论

相关推荐

    struts2验证框架

    1. Validator Framework:Validator Framework 是 Struts2 验证框架的核心组件,负责对用户输入的数据进行验证。Validator Framework 提供了一个通用的验证机制,可以对用户输入的数据进行验证。 2. Validators:...

    struts2校验框架

    其中,Struts2校验框架(Validation Framework)是该框架的核心特性之一,主要用于确保用户输入的数据符合预期的格式或范围,从而有效避免因数据不规范而引发的各种问题。 #### 二、Struts2校验框架的基本概念 在...

    Struts中多种验证总结

    总结起来,Struts提供了多种验证方式,包括ActionForm验证、XML配置的Validation框架、动态验证、Tiles验证、拦截器验证、第三方验证库集成以及客户端的AJAX验证。选择合适的方式取决于项目需求和团队偏好,重要的是...

    struts2必要jar包

    - `struts2-validation.jar` 和 `struts2-i18n-plugin.jar`: 提供了表单验证和国际化支持,`struts2-validation.jar`包含Struts2内置的验证框架,而`struts2-i18n-plugin.jar`则用于处理多语言环境。 8. **Logging...

    J2EE基础的校验demo

    Java校验框架(Java Validation Framework)是Java EE规范的一部分,提供了一种标准的方式来验证对象的属性。它允许开发者定义验证规则,并在数据被持久化或业务逻辑处理之前进行检查。这有助于保持数据的一致性和...

    struts2lib

    5. **Validation Framework**: Struts2提供了内置的验证框架,用于数据验证,这可能会包含独立的JAR文件。 6. **Internationalization (i18n) Resources**: 用于支持多语言的资源文件,这些通常不是JAR文件,而是....

    struts课堂资料\第六章(国际化、验证框架)

    第六章的主题涵盖了两个关键概念:国际化(Internationalization, i18n)和验证框架(Validation Framework)。这两个特性对于开发出适应多语言环境并能确保用户输入数据质量的应用程序至关重要。 一、国际化(i18n...

    struts2_jar

    Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它由Apache软件基金会维护。这个“struts2_jar”压缩包包含了一系列的jar文件,这些文件是构建和运行Struts2应用所必需的组件。 在...

    struts2培训教程

    - **验证框架(Validation Framework)**:提供了一套完整的验证机制,支持客户端和服务器端的验证。 - **国际化(Internationalization)**:支持多语言,方便为不同地区用户提供本地化服务。 #### 五、小结 ...

    struts的结构

    此外,Struts框架还包括`Validation Framework`用于表单验证,`Struts TagLib`用于简化JSP页面的开发,`BeanUtils`和`Collections`等工具类用于辅助数据操作,以及`Digester`用于解析XML配置文件。 #### Struts配置...

    Struts教程

    除了上述组件,Struts还包括国际化支持、异常处理、标签库(例如Tiles框架用于布局管理)以及验证框架(Validation Framework)等,这些都极大地增强了开发者的生产力和应用的可维护性。 Struts的Validation ...

    struts2.1.6全部jar包

    - **强大的表单验证(Validation)**:通过XML或注解方式实现,可以对用户输入进行验证。 - **强大的结果类型(Result Types)**:除了默认的JSP结果外,还可以定义自定义的结果类型,如Redirect、Stream等。 - **...

    Struts经典教程

    - **Validation Framework**:提供了内置的验证机制,对用户输入进行校验。 - **Tiles**:用于页面布局和组件化,提高视图的复用和管理。 通过本教程的学习,开发者将能够熟练掌握Struts框架的使用,包括配置、...

    struts2教程

    - 提供拦截器(Interceptor)、验证框架(Validation Framework)等功能。 **知识点2:开发工具与程序库版本** - **开发工具:** MyEclipse6 - **Web服务器:** Tomcat6 - **Struts版本:** Struts2.0.11.1 - **...

    Strues2的全部jar包

    4. **Validation Framework**:内置的验证框架可以帮助开发者实现数据验证,可以定义在Action类或者XML配置文件中,提供了丰富的错误处理机制。 5. **Internationalization (i18n)**:Struts2支持多语言,通过资源...

    struts validator框架以及filter 乱码

    Validator框架通过读取XML配置文件(如`validation.xml`和`validator-rules.xml`)来获取验证规则,然后在用户提交表单时执行这些规则,确保输入的数据满足预设的要求。 `validation.xml`文件通常位于Action类的...

    Struts教程 web架构

    除了以上核心组件,Struts还提供了其他特性,如国际化支持、异常处理、验证框架(Validation Framework)等,使得开发者能够创建更健壮、可维护的Web应用。 总结 Struts框架以其强大的MVC支持和丰富的组件库,成为...

Global site tag (gtag.js) - Google Analytics