• 编程式验证中的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级别错误消息,而不再是字段级别的错误消息。
     
     
     
  • 相关阅读:
    机器学习入坑指南(二):数据预处理
    03双向链表
    小甲鱼 例题
    快慢指针问题
    02循环单链表
    01静态链表
    阈值化
    图像金字塔与图片尺寸缩放
    水漫填充
    形态学滤波(4):使用分水岭算法对图像进行分割
  • 原文地址:https://www.cnblogs.com/gxpblogs/p/3072175.html
Copyright © 2020-2023  润新知