Struts集成的校验方式

Struts作为一个流行的MVC框架,里面集成了很多优秀的设计思想,其中包括数据校验的方式。

Struts提供了两种方式:

         1.编程实现业务数据的完整性和规范性校验;

         2.使用XML配置文件实现数据校验

在介绍这两种方式之前,我们先来看看不使用框架时如何进行数据校验和检验本身完成的功能,及校验有哪些特性。为了更好的说明问题,我们需要举一个例子,如几乎所有系统中都涉及到的用户管理中的添加用户,一个合法的用户需要有下面的信息:用户名,登录名,密码,年龄,生日,邮箱,主页地址等信息。假设这些信息都是必须输入的,具体的要求如下:用户名必须是中文并且长度大于2,登录名必须是字符串并且长度不能小于6,年龄必须是整数,生日必须是合法的日期类型,邮箱和主页地址必须遵循W3C中规定的格式。我们需要在Service或者Business层对数据进行校验,校验程序如下:

   public boolean validate(){
  
  if(username==null||username.trim().equals("")||!username.matches("[\\u4E00-\\u9FA5]")){
   return false;
  }
  if(loginName==null||loginName.trim().equals("")||!loginName.matches("^[A-Za-z][A-Za-z0-9-_]{5,16}")){
   return false;
  }
  if(password==null||password.trim().equals("")||!password.matches("^[A-Za-z][A-Za-z0-9-_]{5,16}")){
   return false;
  }
  
  if(age==null||age.trim().equals("")||!age.matches("^[1-9][0-9]{0-2}")){
   return false;
  }
  
  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  
  try{
   sdf.parse(birthdate);
  }catch(Exception e){
   return false;
  }
  
  if(email==null||email.trim().equals("")||!email.matches("比较复杂的表达式")){
   return false;
  }
  
  if(homepage==null||homepage.trim().equals("")||!homepage.matches("比较复杂的表达式")){
   return false;
  }
  
  return true;
 }

我们一般是在Service层实现一个类似的validate方法,对UserDTO进行数据检验。下面我们来分析一下整个校验的程序的特点:

1.大量重复的不能为空的判断代码和trim代码。

2.大量的正则表达式判断。

3.由于web程序中客户端向服务器端传送的数据都是字符串格式的,所以需要根据实际的数据类型进行转换,以判断是否是合法的数据

4.对于一些数字类型,我们需要根据实际需要限制其输入范围

5.对于一些字符串类型,我们需要限制输入的最小长度和最大长度

上面只是一个简单的总结,但是我们也可以看出其中的一些规律,抽取其中的不变的部分,将其变成不同校验类型的摸版,如正则表达式校验,变动的是检验的对象和对对象值进行校验的表达式,校验的代码是不变的;再如不能为空的校验中只有校验的对象是变动的等等。

 

下面我们在来看看Struts中的校验,先来看第一种,通过编程的方式进行校验。

Struts中通过编程的方式校验数据的方式和我们上面的validate方法类似。在Struts框架中,数据校验是Action中进行的,Struts定义了一些规则,使得Struts在访问Action的时候能够判断是否需要对Action中的数据进行判断。Action的规则如下:需要进行数据校验的Action必须实现ActionSupport类型,并且必须实现其中的validate方法,如果Struts访问Action的时候发现Action中有validate方法,则在运行Action中对应的方法之前,先执行validate方法,如果校验失败,则不再执行对应的方法,而是返回一个名字input的result。基本原理是这样的,但是作为一个框架,另外一个问题又来了,如果Action中有多个方法,其中只有一个方法需要校验怎么办?Struts中又定义了如下的方法名签名规则:validate+首字母大写的方法名。举个例子,如果我们在Action中有一个save方法需要校验,则校验方法名定义如下validateSave,这个校验方法只对Action中的save方法进行校验。

 

但是上面的编程校验的方法并没有解决我们重复编写编写校验代码的问题,于是Struts又实现了另外一种校验方式,把我们从编程中解脱出来,那就是通过XML配置的方式校验我们数据的完整性。原理如下:通过一个validate引擎,读取配置文件中的变化的部分信息,如字段名,校验规则,校验类型(Struts定义了一系列的校验类型,如不能为空,字符串长度,正则表达式等),然后取得校验类型的实例,并把校验规则和Action中字段名对应的值传入校验类型实例中,并且调用其中的validate方法进行校验。下面是个例子,我们在PersonAction中定义了两个变量:username和mobileno,我们需要通过XML文件对这两个变量进行合法校验,XML的命名规则如下ActionClassName-validation.xml,下面就是我们校验文件的内容:

<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.3//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="mobileno">
        <field-validator type="requiredstring">
            <message>手机号必须输入</message>
        </field-validator>
        <field-validator type="regex">
             <expression><![CD[^1[359]\d{9}]]></expression>
            <message>手机号不合法</message>
        </field-validator>
    </field>
</validators>

XML文件中把其中校验器中变化的部分配置进去,然后通过校验引擎注入到校验器实例中取,达到校验的目的。如果Struts框架访问某个Action的时候,通过这个Action的类名通过上面的命名规则查找是否有校验配置文件,如果有则对Action进行校验。这个也有上面的Action中有多个方法的问题,解决方案也是一样,只不过是对配置文件的文件签名做了一些规定,具体:ActionClassName-ActionName-validation.xml。通过在struts.xml中配置的ActionName找到对应的方法名进行校验。

第一篇终于写完了,很简陋,但是会一直坚持下去,记录一下每天的学习心得,尽量介绍一些原理性的东西,减少一些代码的内容,像这种代码百度会给你成千上万的例子。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值