验证大家都熟悉,一般分为两种:客户端验证和服务器端验证。

客户端验证:顾名思义就是在jsp等显示页面进行验证,一般使用js或jquery进行验证。其优势在于

①减少客户的等待时间

②减少服务器的压力

但是,仅仅有客户端验证是不行的。因为要防止用户“绕过”客户端验证输入不合法数据。用户把页面另存为,再修改其验证规则,再发送到服务器(我还没干过这事,以后有机会试试。当然估计不会这么容易),如果在服务器端没有进行验证,那么是狠“危险滴”。

服务器端验证,一般有两种方式:

①在Action中继承ActionSupport,在业务方法中进行验证或重写validate()方法

②使用struts2的验证框架

本章就重点讲一下服务器端的验证。

一、在业务方法中直接验证:

  1. public void RegisterAction extends ActionSupport { 
  2.      private String username; 
  3.      private String password; 
  4.      private int age; 
  5.      
  6.      public String execute(){ 
  7.           //验证用户名 
  8.            if(null==username || "".equals(username)){ 
  9.               this.addFieldError("username","不能为空"); 
  10.           //fieldError对应页面的<s:fielderror>标签,表示属性级错误 
  11.            } 
  12.          //验证密码和年龄,类似这样验证 
  13.          this.addActionError("用户注册信息错误"); 
  14. //actionError对应页面的<s:actionerror>标签,表示action级的错误 
  15.          if(this.hasErrors())     return "input"
  16. //其内部其实是:this.hasActionErrors() || this.hasFieldErrors() 
  17. //具体fieldError和actionError区别,建议实践一下 
  18.          return "success"
  19.      } 
  20.  

关于上面的"return  'input'",注意要在action中配置一个name="input"的result,因为验证有错误就会返回一个“input”

可以发现,上面的验证方式缺点很明显:验证和业务都混在一起,难于维护,难于代码重用。。。

因此可以用下面这种验证方式:

二、重写validate()方法:

  1.     public void RegisterAction extends ActionSupport {  
  2.          private String username;  
  3.          private String password;  
  4.          private int age;  
  5.           
  6.          public String execute(){  
  7.              //  ......业务代码 
  8.          } 
  9. /* 
  10. *   重写validate()方法 
  11. */ 
  12.          pulblic void validate(){ 
  13.               //验证用户名  
  14.                if(null==username || "".equals(username)){  
  15.                   this.addFieldError("username","不能为空");  
  16.               //fieldError对应页面的<s:fielderror>标签,表示属性级错误  
  17.                }  
  18.              //验证密码和年龄,类似这样验证 ,此处省略 
  19.              this.addActionError("用户注册信息错误");  
  20.              if(this.hasErrors())     return "input";  
  21.              return "success";  
  22.          }  
  23.       
  24.     }  

使用validate()方法的改进在于把验证代码都放到validate()方法中,而验证方式和显示错误信息等都不变。

这个方法的执行原理:首先运行validate()方法,没有错再运行业务方法。而且,这个validate()方法会对该Action类中所有业务方法都有效。所以,在validate()方法中,我们只能进行业务的公共验证,方便代码的重用。

问题:那怎么对单独的业务方法进行验证?看下面

使用validateXxx()方法进行验证:

这里代码就不写了,控制格式很麻烦,又没提示。。。。

意思很明白,比如我要对登录方法login()单独进行验证,那么就写一个validateLogin()方法,这个方法里面就写对登录的单独验证代码。注意方法的命名规范

注意:validate()和validateXxx()方法同时存在Action中的话会同时生效,先执行validateXxx()方法,在执行validate()方法。

上面所提到validate()验证方法倒是解决了验证代码和业务代码的分离,但是它们终究还是在一个Action中,如果要把它们彻底分开,就要使用struts2的验证框架了。继续看

三、验证框架

不说什么验证框架了,搞的很高智商似的。其实就是个xml格式的文件。这就是所谓的"框架"

使用方法:

①在Action类的同目录下创建ActionName-validation.xml配置文件(ActionName是指Action的名字),而这个文件相当于上面提到的validate()方法。很容易理解吧。。。

②还是在同目录下创建ActionName-alias-validation.xml配置文件,这个就相当于前面提到的validateXxx()方法,可以单独对某个业务进行验证。注意:alias是业务方法名。

③编写验证规则,验证规则比较好理解,可以google或查看帮助文档。有字段验证器和非字段验证器两种形式,在项目中应该商量好统一用一种

总结:

主要讲了两种验证方式,比较起两种验证方式,实质是一样的,只是表现形式不同。