struts2数据校验
  52ch3nBPBnM3 2023年11月02日 32 0


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

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

  struts2的action都要继承ActionSupprot类,这个类实现了Validateable与ValidationAware这两个跟数据验证有关的接口。其中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,甚至于提供给后来的同学们使用,抽象成一个独立的验证器,通过配置文件来声明,以达到复用。


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


  一般新建自定义的验证器,我们要继承ValidatorSupport或FieldValidatorSupport类。下面以一个密码验证的代码例子为说明:
   所需验证的密码数据要满足下面条件:
   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>

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
52ch3nBPBnM3
作者其他文章 更多