编程式验证中的Action级别错误信息、字段级别错误信息详解

 
接上一篇问到的下面红色字体部分↓↓↓
 
@Override
public void validate() {
  if (this.user.getUname().length()==0) {
    this.addFieldError("uname", "用户名不能为空aaa!");
    this.addFieldError("uname", "用户名不能为空bbb!");  
     
  }
  super.validate();
}
答案是:当用户名为空时,这两个都会显示在jsp页面
 
分析:
struts2 api中是这样写的
Action level messages are kept in a Collection. 
Field level error messages are kept in a Map from String field name to a List of field error msgs.
译:
Action级别信息保存在一个集合,字段级别的错误信息都保存在一个从字符串字段名称到List字段错误信息的Map中。
 
其实把Action级别错误信息保存到集合与字段级别错误信息保存到map差不多,具体区别见本页最后。
 
因此我们就以把field级别错误信息保存到map为例:
把field错误信息保存到Map中步骤:
1.首先它会检查map中有没有以字段名命名的key;
2.如果没有:map.put("",new List());还会把错误信息放到list对象中;
3.已经有了,就通过这个key得到所应对应的集合对象--list对象,map.get("uname"),然后再把错误信息放进去;
注:有多少field,它就会放多少
 
具体调用到的代码:

//用户验证的Action会调用ActionSupport中的addFieldError(...)方法
public void addFieldError(String fieldName, String errorMessage) {
        validationAware.addFieldError(fieldName, errorMessage);
     //ActionSupport在此调用ValidationAwareSupport类中的addFieldError(...)方法
    }
 
 
 //ValidationAwareSupport类
 public synchronized void addFieldError(String fieldName, String errorMessage) {
        final Map> errors = internalGetFieldErrors();
        List thisFieldErrors = errors.get(fieldName);
 
        if (thisFieldErrors == null) {
            thisFieldErrors = new ArrayList();
            errors.put(fieldName, thisFieldErrors);
        }
 
        thisFieldErrors.add(errorMessage);
    }

private Map<String, List<String>> internalGetFieldErrors() {
        if (fieldErrors == null) {
            fieldErrors = new LinkedHashMap<String, List<String>>();
        }

        return fieldErrors;
    }

 
Action级别与字段级别错误信息的区别?
:区别在于这两个级别错误信息发生时间不同
    <1>字段级别错误信息发生时间:
params拦截器拦下数据之后,马上进行验证,验证的时候数据还有赋值给这个属性。
这时也许有人会:既然这个时候数据还没有赋值给这个属性,那么它的的值是怎么来的?
答案是:缓存机制把值赋给这个属性。
    <2>Action级别错误信息发生时间:
是在执行execute方法之前。
注:非字段验证器在验证失败时会产生一条Action级别错误消息,而不再是字段级别的错误消息。
 
 
 
原文地址:https://www.cnblogs.com/gxpblogs/p/3072175.html