Struts2验证器(验证器框架流程,自定义验证器,注意事项)

Struts2验证应该包括验证器(需要xml配置)和Action中的validate()验证方法两种。后者很简单,只需要把

验证条件加进去就可以啦!

一.   我们先看看验证框架的流程,这样你会很清楚验证的过程。

请求参数会通过拦截器params拦截器将参数转移到ValueStack公开的属性上,注意此时参数并没有直接转移到action类中的属性上面。之后会在其后遇到验证器(如果你用了验证器)一旦验证没通过,它会产生错误信息,中间可能还会经过一系列拦截器,这里不讨论,关于拦截器,下一篇将详细讲解。后面会到workflow拦截器,此时拦截器会调用Action中的validate ()方法进行验证,验证不通过也会产生错误信息。接着workflow拦截器会检查错误信息,通过检查ValidationAware的hasErrors()方法,它并不会关心是谁产生的错误信息,只要产生了就会改变工作流并且返回输入页面。如果都没有错误才会执行动作其他部分。

 

   验证器的使用:

      举例说明:

    1.创建一个Action ,我的是PersonAction类在包cn.itcast.Action下,代码如下:

package cn.itcast.Action;

import java.util.regex.Pattern;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class PersonAction extends ActionSupport {
 
 public String getUsername() {
  return username;
 }
 public void setUsername(String username) {
  this.username = username;
 }
 public String getMobile() {
  return mobile;
 }
 public void setMobile(String mobile) {
  this.mobile = mobile;
 }
 private String  username;
 private String mobile;

 public String updata(){
  ActionContext.getContext().put("message","更新成功");
  return "message";
 }
 
 public String save(){
  ActionContext.getContext().put("message","保存成功");
  return "message";
 }
 /*
 public void validate()方法会对所有的方法都进行校验。如果你只想对指定方法进行校验,比如
 只对 save()方法进行校验,而不对updata()方法进行校验,则可以用public void validatexxx()中
 xxx为需要验证方法的方法名,且首字母大写。比如:public void validateSave(){} 则只会对save()方法
 进行校验。
 */
 @Override
 public void validate() {
  // TODO Auto-generated method stub
  if(this.username==null||"".equals(username.trim())){
   this.addFieldError("username", "用户名不能为空");
   
  }
  if(this.mobile==null||"".equals(mobile.trim())){
   this.addFieldError("mobile", "手机号码不能为空");
   
  }else{
   if(!Pattern.compile("^1[358]\\d{9}$").matcher(mobile).matches()){
    this.addFieldError("mobile", "手机格式不正确");
   }
    
  }
  super.validate();
 }
}

 

2.创建一个验证器,xml形式,名称为PersonAction-validation.xml,命名规则   需验证的Action类名-validation.xml  并且要和PersonAction类在同一个目录下。代码如下:

        "-//OpenSymphony Group//XWork Validator 1.0.3//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
       
       
   
       
            用户名不为空
       

       
        heh
       

   

   
       
            邮箱不能为空
       

       
            邮箱格式不正确
       

   

   
      
           电话号码不能为空
      

      
          
           电话号码格式不正确
      

   


       

只需要这样,然后就可以验证啦。需要注意的是: 

1.  验证器中中name应该是表单中的name属性。

2.如果验证的是一个对象中的属性,例如

public class registerAction extends ActionSupport {

public User user;
     public User getUser() {
      return user;
 }

 public void setUser(User user) {
  this.user = user;

后面代码省略

}

验证里面的user中的属性,此时提交表单中name应该为user.email 这样的类型。只有这样才可以匹配到User类的属性上去。

 }

3. 怎样把错误信息自由地在提交页面任意处显示。

(1)addFieldError("名称", "用户名不能为空");方法添加的错误信息。使用标签即可。

(2)验证器中方式,则应该用标签   中%{' field name '} field name 是指指定要验证的字段名如:中的user.username.

(3)在表单添加代表全部错误信息都输出。包括前面两种方式添加的错误信息。

 

二.自定义验证器

 在struts2框架下,自定义验证器很容易。

1. 先创建一个类,用来写自定义的验证方法。下面是我写的MyValidate类

package cn.itcast.Action;

import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;

public class MyValidate extends FieldValidatorSupport{

 public void validate(Object obj) throws ValidationException {
  // TODO Auto-generated method stub
    String name = super.getFieldName();
    String value = super.getFieldValue(name, obj).toString();
       System.out.println(name);System.out.println(value);
       super.addFieldError(super.getFieldName(), obj);

 }

}

它继承FieldValidatorSupport类,重写validate()方法,验证规则就写在validate()方法里面。解释下里面关键的几点。super.getFieldName();获取xml验证中的需要验证的字段名。super.getFieldValue(name, obj).toString();获取表单提交的该字段的值。super.addFieldError(super.getFieldName(), obj);添加错误信息。运行下你就可以看到控制台打印出来的结果。具体机制参考源代码。

2.追加验证器

 要想让自己写的校验类变成像默认校验器一样方便使用,必须把这个自己写的校验器追加,记住是追加到验证框架中。展开xwork-2.0.4.jar,com.opensymphony.xwork2.validator.validators目录下有个default.xml,打开后你会看到里面列出了所有默认验证器。你想把你自定义的验证器追加进去,只需要在项目的根目录下即src下粘贴default.xml,改名为validators.xml,之所以复制关键是需要里面的头部一些信息。在里面配置

   
  
 

就可以啦。接着就可以像默认的验证器一样使用啦。如:


       
            用户名不为空
       

   

就可以应用自定义的名为test的验证器。

 

三 . Visitor校验器  在域对象级别上验证以及利用上下文优化

 目的:  当一个对象比如User  在很多Action或不同方法中都使用,但是使用前都必须检验User里面属性的合法性。这是按照上面的方法,我们必须为每个Action类配置一个验证  文件。但是每个验证文件里面的内容有都是一样的,为了减小重复,我们采用Visitor校验器 在域对象级别上验证。实际上就是相当于都去调用一个验证User的配置文件。

  1.先创建一个UserAction类,里面包含User对象。

public class UserAction extends ActionSupport {
    private User user;
 public String adduser(){
  ActionContext.getContext().put("message", "增加成功");
  return "success";
 }
 
 public String updateuser(){
  ActionContext.getContext().put("message", "修改成功");
  return "success";
 }

 public void setUser(User user) {
  this.user = user;
 }

 public User getUser() {
  return user;
 }
 
 public String  execute(){
  
  return SUCCESS;
 }
 
}

2.在同一个目录下创建 UserAction-validation.xml    代码如下:

        "-//OpenSymphony Group//XWork Validator 1.0.3//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">


    
        
                       
            add
        
            true
                         
            错误:
        

 3. 然后在User类(包含User属性的bean)所在包建立名为User-add-validation.xmladd为上面add中定议),内容如下

        "-//OpenSymphony Group//XWork Validator 1.0.3//EN"
        "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
       
       
   
       
            用户名不为空
       

       
        heh
       

   

   
       
            邮箱不能为空
       

       
            邮箱格式不正确
       

   

   
      
           电话号码不能为空
      

      
          
           电话号码格式不正确
      

   


    

这也就是实际验证User字段的地方。上面UserAction-validation.xml    里面实际起到调用User-add-validation.xml来验证对象User的作用。

       关于上面的完整示例代码 可以下载,下载地址:

     1. http://download.csdn.net/detail/kekedou3hao/3777139

     2.http://download.csdn.net/detail/kekedou3hao/3778487

       3.http://download.csdn.net/detail/kekedou3hao/3779744

 

注:我的开发工具是MyEclipse+Tomcat    以上纯属个人学习总结,如若有不完善的地方敬请谅解,更希望能斧正。本人是个大学生,正在学习当中,如有愿意一起学习的可以加QQ群  45919266 

 

 


 

 

 

   

你可能感兴趣的:(Struts2,验证框架)