zoukankan      html  css  js  c++  java
  • 编程式验证中的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级别错误消息,而不再是字段级别的错误消息。
     
     
     
  • 相关阅读:
    我要好offer之 二叉树大总结
    我要好offer之 字符串相关大总结
    楼层扔鸡蛋问题[转]
    Linux System Programming 学习笔记(十一) 时间
    Linux System Programming 学习笔记(十) 信号
    Linux System Programming 学习笔记(九) 内存管理
    Linux System Programming 学习笔记(八) 文件和目录管理
    Linux System Programming 学习笔记(七) 线程
    Linux System Programming 学习笔记(六) 进程调度
    APUE 学习笔记(十一) 网络IPC:套接字
  • 原文地址:https://www.cnblogs.com/gxpblogs/p/3072175.html
Copyright © 2011-2022 走看看